Simple annotation parsing

This phase collects all the annotations found on AModuleDecl, AClassdef and APropdef and stores them in the related MEntity.

Once the phase has been applied, annotations names are available in AnnotatedMEntity::annotations. One can then ask to the mentity if it holds the annnotation in its source code.

Example:

fun is_annotated_with_foo(mentity: AnnotatedMEntity): Bool do
    return mentity.has_annotation("foo")
end

Note that only the names of the annotations are stored, if one wants to access the annotations arguments, the traditional annotations framework is recommanded.

Introduced classes

abstract class AnnotatedMEntity

nitc :: AnnotatedMEntity

A MEntity that can hold annotations from it's source code
private class ParseAnnotationsPhase

nitc :: ParseAnnotationsPhase

Parse annotations from modules, classdefs and propdefs

Redefined classes

redef class MClassDef

nitc :: parse_annotations $ MClassDef

A definition (an introduction or a refinement) of a class in a module
redef class MModule

nitc :: parse_annotations $ MModule

A Nit module is usually associated with a Nit source file.
redef abstract class MPropDef

nitc :: parse_annotations $ MPropDef

A definition of a property (local property)
redef class ToolContext

nitc :: parse_annotations $ ToolContext

Global context for tools

All class definitions

abstract class AnnotatedMEntity

nitc $ AnnotatedMEntity

A MEntity that can hold annotations from it's source code
redef class MClassDef

nitc :: parse_annotations $ MClassDef

A definition (an introduction or a refinement) of a class in a module
redef class MModule

nitc :: parse_annotations $ MModule

A Nit module is usually associated with a Nit source file.
redef abstract class MPropDef

nitc :: parse_annotations $ MPropDef

A definition of a property (local property)
private class ParseAnnotationsPhase

nitc $ ParseAnnotationsPhase

Parse annotations from modules, classdefs and propdefs
redef class ToolContext

nitc :: parse_annotations $ ToolContext

Global context for tools
package_diagram nitc::parse_annotations parse_annotations nitc::modelize_property modelize_property nitc::parse_annotations->nitc::modelize_property nitc::modelize_class modelize_class nitc::modelize_property->nitc::modelize_class nitc::annotation annotation nitc::modelize_property->nitc::annotation ...nitc::modelize_class ... ...nitc::modelize_class->nitc::modelize_class ...nitc::annotation ... ...nitc::annotation->nitc::annotation nitc::frontend frontend nitc::frontend->nitc::parse_annotations nitc::contracts contracts nitc::contracts->nitc::parse_annotations nitc::model_filters model_filters nitc::model_filters->nitc::parse_annotations nitc::testing_suite testing_suite nitc::testing_suite->nitc::parse_annotations nitc::frontend... ... nitc::frontend...->nitc::frontend nitc::code_gen code_gen nitc::code_gen->nitc::contracts nitc::abstract_compiler abstract_compiler nitc::abstract_compiler->nitc::contracts nitc::code_gen... ... nitc::code_gen...->nitc::code_gen nitc::abstract_compiler... ... nitc::abstract_compiler...->nitc::abstract_compiler nitc::model_collect model_collect nitc::model_collect->nitc::model_filters nitc::model_visitor model_visitor nitc::model_visitor->nitc::model_filters nitc::model_collect... ... nitc::model_collect...->nitc::model_collect nitc::model_visitor... ... nitc::model_visitor...->nitc::model_visitor nitc::testing testing nitc::testing->nitc::testing_suite nitc::testing... ... nitc::testing...->nitc::testing

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module annotation

nitc :: annotation

Management and utilities on annotations
module array

core :: array

This module introduces the standard array structure.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module console

console :: console

Defines some ANSI Terminal Control Escape Sequences.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module digraph

graph :: digraph

Implementation of directed graphs, also called digraphs.
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module ini

ini :: ini

Read and write INI configuration files
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module lexer

nitc :: lexer

Lexer and its tokens.
module lexer_work

nitc :: lexer_work

Internal algorithm and data structures for the Nit lexer
module list

core :: list

This module handle double linked lists
module literal

nitc :: literal

Parsing of literal values in the abstract syntax tree.
module loader

nitc :: loader

Loading of Nit source files
module location

nitc :: location

Nit source-file and locations in source-file
module math

core :: math

Mathematical operations
module mdoc

nitc :: mdoc

Documentation of model entities
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module mmodule

nitc :: mmodule

modules and module hierarchies in the metamodel
module mmodule_data

nitc :: mmodule_data

Define and retrieve data in modules
module model

nitc :: model

Classes, types and properties
module model_base

nitc :: model_base

The abstract concept of model and related common things
module modelbuilder_base

nitc :: modelbuilder_base

Load nit source files and build the associated model
module modelize_class

nitc :: modelize_class

Analysis and verification of class definitions to instantiate model element
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module mpackage

nitc :: mpackage

Modelisation of a Nit package
module native

core :: native

Native structures for text and bytes
module nitpm_shared

nitc :: nitpm_shared

Services related to the Nit package manager
module numeric

core :: numeric

Advanced services for Numeric types
module opts

opts :: opts

Management of options on the command line
module ordered_tree

ordered_tree :: ordered_tree

Manipulation and presentation of ordered trees.
module parser

nitc :: parser

Parser.
module parser_nodes

nitc :: parser_nodes

AST nodes of the Nit language
module parser_prod

nitc :: parser_prod

Production AST nodes full definition.
module parser_work

nitc :: parser_work

Internal algorithm and data structures for the Nit parser
module phase

nitc :: phase

Phases of the processing of nit programs
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module tables

nitc :: tables

Module that interfaces the parsing tables.
module template

template :: template

Basic template system
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module toolcontext

nitc :: toolcontext

Common command-line tool infrastructure than handle options and error messages
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O
module version

nitc :: version

This file was generated by git-gen-version.sh

Parents

module modelize_property

nitc :: modelize_property

Analysis and verification of property definitions to instantiate model element

Children

module contracts

nitc :: contracts

Module to build contract
module frontend

nitc :: frontend

Collect and orchestration of main frontend phases
module testing_suite

nitc :: testing_suite

Testing from external files.

Descendants

module a_star-m

a_star-m

module abstract_compiler

nitc :: abstract_compiler

Abstract compiler
module android

nitc :: android

Compile program for the Android platform
module api

nitc :: api

Components required to build a web server about the nit model.
module api_auth

nitc :: api_auth

module api_base

nitc :: api_base

Base classes used by nitweb.
module api_docdown

nitc :: api_docdown

Nitdoc specific Markdown format handling for Nitweb
module api_feedback

nitc :: api_feedback

Feedback related features
module api_light

nitc :: api_light

Highlight and collect messages from a piece of code
module api_model

nitc :: api_model

module code_gen

nitc :: code_gen

Main frontend phases plus code generation phases
module commands_base

nitc :: commands_base

Documentation commands
module commands_catalog

nitc :: commands_catalog

Commands to retrieve Catalog related data
module commands_docdown

nitc :: commands_docdown

Doc down related queries
module commands_graph

nitc :: commands_graph

Graph commands
module commands_http

nitc :: commands_http

Initialize commands from HTTP requests
module commands_model

nitc :: commands_model

Doc commands about a Model or a MEntity
module commands_parser

nitc :: commands_parser

A parser that create DocCommand from a string
module commands_usage

nitc :: commands_usage

Commands about how mentities are used
module compiler

nitc :: compiler

Compilation to C
module compiler_ffi

nitc :: compiler_ffi

Full FFI support for the compiler
module compiler_serialization

nitc :: compiler_serialization

Serialization support for the compiler
module emscripten

nitc :: emscripten

Compile to JavaScript using the Emscripten SDK
module global_compiler

nitc :: global_compiler

Global compilation of a Nit program
module highlight

nitc :: highlight

Highlighting of Nit AST
module html_commands

nitc :: html_commands

Render commands results as HTML
module html_model

nitc :: html_model

Translate mentities to html blocks.
module htmlight

nitc :: htmlight

Highlighting of Nit AST with HTML
module inheritance_metrics

nitc :: inheritance_metrics

Collect metrics about inheritance usage
module ios

nitc :: ios

Compile programs for the iOS platform
module java_compiler

nitc :: java_compiler

Compile Nit code to Java code
module json_commands

nitc :: json_commands

Translate command results to json
module json_model

nitc :: json_model

Make model entities Serializable.
module light

nitc :: light

Light FFI support for the compiler
module light_only

nitc :: light_only

Compiler support for the light FFI only, detects unsupported usage of callbacks
module mclasses_metrics

nitc :: mclasses_metrics

Collect common metrics about mclasses
module md_commands

nitc :: md_commands

Render commands results as Markdown
module memory_logger

nitc :: memory_logger

Extension to inject memory-tracing instrumentation in code generated by nitc.
module mendel_metrics

nitc :: mendel_metrics

The Mendel model helps to understand class hierarchies.
module metrics

nitc :: metrics

Various statistics about Nit models and programs
module mmodules_metrics

nitc :: mmodules_metrics

Collect common metrics about modules
module model_collect

nitc :: model_collect

Collect things from the model.
module model_index

nitc :: model_index

Search things from the Model
module model_visitor

nitc :: model_visitor

Simple visitor framework for Nit models.
module nit

nitc :: nit

A naive Nit interpreter
module nitc

nitc :: nitc

A Nit compiler
module nitcatalog

nitc :: nitcatalog

Basic catalog generator for Nit packages
module nitdoc

nitc :: nitdoc

Generator of static API documentation for the Nit language
module nith

nitc :: nith

A ligHt Nit compiler
module nitj

nitc :: nitj

Compile Nit into Java code runnable on the Java Virtual Machine.
module nitlight

nitc :: nitlight

Tool that produces highlighting for Nit programs
module nitmetrics

nitc :: nitmetrics

A program that collects various metrics on nit programs and libraries
module nitpackage

nitc :: nitpackage

Helpful features about packages
module nitpick

nitc :: nitpick

A program that collect potential style and code issues
module nitrestful

nitc :: nitrestful

Tool generating boilerplate code linking RESTful actions to Nit methods
module nitsaf

nitc :: nitsaf

Nit Static Analysis Framework client example.
module nitserial

nitc :: nitserial

Serialization support compiler, a tool to support deserialization of live generic types
module nitsmells

nitc :: nitsmells

module nituml

nitc :: nituml

UML generator in dot format.
module nitunit

nitc :: nitunit

Testing tool.
module nitvm

nitc :: nitvm

The Nit virtual machine launcher
module nitweb

nitc :: nitweb

Runs a webserver based on nitcorn that render things from model.
module nitx

nitc :: nitx

nitx, a command tool that displays useful data about Nit code
module nullables_metrics

nitc :: nullables_metrics

Statistics about the usage of nullables
module readme_metrics

nitc :: readme_metrics

Collect common metrics about README files
module rta_metrics

nitc :: rta_metrics

Metrics from RTA
module separate_compiler

nitc :: separate_compiler

Separate compilation of a Nit program
module separate_erasure_compiler

nitc :: separate_erasure_compiler

Separate compilation of a Nit program with generic type erasure
module static

nitc :: static

Nitdoc generation framework
module static_base

nitc :: static_base

Base entities shared by all the nitdoc code
module static_cards

nitc :: static_cards

Cards templates for the static documentation
module static_html

nitc :: static_html

Render documentation pages as HTML
module static_index

nitc :: static_index

Manage indexing of Nit model for Nitdoc QuickSearch.
module static_structure

nitc :: static_structure

Composes the pages of the static documentation
module term

nitc :: term

module term_model

nitc :: term_model

Markdown templates for Nit model MEntities.
module test_astbuilder

nitc :: test_astbuilder

Program used to test the clone method of the astbuilder tool
module test_highlight

nitc :: test_highlight

Program used to test the Nit highlighter
module test_model_visitor

nitc :: test_model_visitor

Example of model_visitor
module test_neo

nitc :: test_neo

Test for neo model saving and loading.
module test_test_phase

nitc :: test_test_phase

Example of simple module that aims to do some specific work on nit programs.
module testing

nitc :: testing

Test unit generation and execution for Nit.
module uml

nitc :: uml

Group head module for UML generation services
module uml_base

nitc :: uml_base

Exposes the base class for UML generation of a Model
module uml_class

nitc :: uml_class

Provides facilities of exporting a Model to a UML class diagram
module uml_module

nitc :: uml_module

Services for generation of a UML package diagram based on a Model
module vim_autocomplete

nitc :: vim_autocomplete

Generate files used by the Vim plugin to autocomplete with doc
module xcode_templates

nitc :: xcode_templates

Templates and other services to create XCode projects
# Simple annotation parsing
#
# This phase collects all the annotations found on AModuleDecl, AClassdef and
# APropdef and stores them in the related MEntity.
#
# Once the phase has been applied, annotations names are available in
# `AnnotatedMEntity::annotations`.
# One can then ask to the mentity if it holds the annnotation in its source code.
#
# Example:
# ~~~nitish
# fun is_annotated_with_foo(mentity: AnnotatedMEntity): Bool do
#     return mentity.has_annotation("foo")
# end
# ~~~
#
# Note that only the names of the annotations are stored, if one wants to access
# the annotations arguments, the traditional annotations framework is recommanded.
module parse_annotations

import phase
import modelize_class
import modelize_property
private import annotation

redef class ToolContext
	# Parse the annotations on modules, classdefs and propdefs
	var parse_annotations_phase: Phase = new ParseAnnotationsPhase(self,
		[modelize_class_phase, modelize_property_phase])
end

# Parse annotations from modules, classdefs and propdefs
#
# Found annotations names are stored in `AnnotatedMEntity::annotations`.
private class ParseAnnotationsPhase
	super Phase

	# Lookup for `nmodule` annotations
	redef fun process_nmodule(nmodule) do
		var mmodule = nmodule.mmodule
		if mmodule == null then return

		var nmoduledecl = nmodule.n_moduledecl
		if nmoduledecl == null then return

		var nannots = nmoduledecl.n_annotations
		if nannots == null then return

		for nannot in nannots.n_items do
			mmodule.annotations.add nannot.n_atid.n_id.text
		end
	end

	# Lookup for `nclassdef` annotations
	redef fun process_nclassdef(nclassdef) do
		var mclassdef = nclassdef.mclassdef
		if mclassdef == null then return

		for npropdef in nclassdef.n_propdefs do
			if not npropdef isa AAnnotPropdef then continue
			mclassdef.annotations.add npropdef.n_atid.n_id.text
		end
	end

	# Lookup for `npropdef` annotations
	redef fun process_npropdef(npropdef) do
		var mpropdef = npropdef.mpropdef
		if mpropdef == null then return

		var nannots = npropdef.n_annotations
		if nannots == null then return

		for nannot in nannots.n_items do
			mpropdef.annotations.add nannot.n_atid.n_id.text
		end
	end
end

# A MEntity that can hold annotations from it's source code
#
# We do not introduce these services in MEntity to avoid semantics confusion.
# At this stage, the annotation concept is only relevant to source code related
# mentities such as MModules, MClassDefs and MPropdefs.
abstract class AnnotatedMEntity

	# Names of the annotations found on `self` declaration
	var annotations: Set[String] = new HashSet[String]

	# Does `self` contains `annotation` in its declaration?
	fun has_annotation(annotation: String): Bool do return annotations.has(annotation)
end

redef class MModule
	super AnnotatedMEntity

	redef var is_test is lazy do return has_annotation("test")
end

redef class MClassDef
	super AnnotatedMEntity

	redef var is_test is lazy do return has_annotation("test")
end

redef class MPropDef
	super AnnotatedMEntity

	redef var is_test is lazy do return has_annotation("test")

	redef var is_before is lazy do return has_annotation("before")

	redef var is_before_all is lazy do return has_annotation("before_all")

	redef var is_after is lazy do return has_annotation("after")

	redef var is_after_all is lazy do return has_annotation("after_all")
end
src/frontend/parse_annotations.nit:15,1--131,3