- if not self isa AExprAtArg then return null
- var nexpr = n_expr
- if not nexpr isa ACallExpr then return null
- if not nexpr.n_expr isa AImplicitSelfExpr then return null
- if not nexpr.n_args.n_exprs.is_empty then return null
- return nexpr.n_id.text
+ var res = collect_annotations_data_cache.get_or_null(name)
+ if res == null then
+ res = new MModuleData[AAnnotation](model)
+ collect_annotations_data_cache[name] = res
+ end
+
+ for mmod in mmodule.in_importation.greaters do
+ if res.has_mmodule(mmod) then continue
+ var ass = get_mmodule_annotation(name, mmod)
+ if ass == null then continue
+ res[mmod] = ass
+ end
+ return res
+ end
+
+ # Get an annotation by name from `mmodule` and its super modules. Will recursively search
+ # in imported module to find the "latest" declaration and detects priority conflicts.
+ fun lookup_annotation_on_modules(name: String, mmodule: MModule): nullable AAnnotation
+ do
+ var data = collect_annotations_data(name, mmodule)
+ var annotations = data.lookup_values(mmodule, none_visibility)
+ if annotations.is_empty then return null
+ if annotations.length > 1 then
+ var locs = new Array[Location]
+ for annot in annotations do locs.add(annot.location)
+
+ toolcontext.error(mmodule.location,
+ "Error: priority conflict on annotation `{name}`, it has been defined in: {locs.join(", ")}.")
+ end
+ return annotations.first