Skip to content

Commit

Permalink
ast: duplicateFeatureDeclaration, deduplicate if a,b are switched around
Browse files Browse the repository at this point in the history
  • Loading branch information
michaellilltokiwa committed Sep 9, 2024
1 parent 26ad09e commit bfd0574
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 26 deletions.
23 changes: 14 additions & 9 deletions src/dev/flang/ast/AstErrors.java
Original file line number Diff line number Diff line change
Expand Up @@ -944,23 +944,28 @@ public static void repeatedInheritanceCannotBeResolved(SourcePosition pos, Abstr
"To solve this, you could add a redefinition of " + sbnf(f1) + " to " + s(heir) + ".");
}

public static void duplicateFeatureDeclaration(SourcePosition pos, AbstractFeature f, AbstractFeature existing)
public static void duplicateFeatureDeclaration(AbstractFeature a, AbstractFeature b)
{
// suppress error message if errors were reported already and any feature
// involved is f_ERROR
if (!any() || (f != Types.f_ERROR &&
f .outer() != Types.f_ERROR &&
existing != Types.f_ERROR &&
existing.outer() != Types.f_ERROR ))
if (!any() || (a != Types.f_ERROR &&
a .outer() != Types.f_ERROR &&
b != Types.f_ERROR &&
b.outer() != Types.f_ERROR ))
{
var of = f.isTypeFeature() ? f.typeFeatureOrigin() : f;
error(pos,
// report in source code order to avoid symmetric error with exchanged roles of f and existing
var cmpRes = a.pos().show().compareTo(b.pos().show())>0;
var aa = cmpRes ? a : b;
var bb = cmpRes ? b : a;

var of = aa.isTypeFeature() ? aa.typeFeatureOrigin() : aa;
error(bb.pos(),
"Duplicate feature declaration",
"Feature that was declared repeatedly: " + s(of) + "\n" +
"originally declared at " + existing.pos().show() + "\n" +
"originally declared at " + aa.pos().show() + "\n" +
"To solve this, consider renaming one of these two features, e.g., as " + sbn(of.featureName().baseNameHuman() + "ʼ") +
" (using a unicode modifier letter apostrophe " + sbn("ʼ")+ " U+02BC) "+
(f.isTypeFeature()
(aa.isTypeFeature()
? ("or changing it into a routine by returning a " +
sbn("unit") + " result, i.e., adding " + sbn("unit") + " before " + code("is") + " or using " + code("=>") +
" instead of "+ code("is") + ".")
Expand Down
4 changes: 2 additions & 2 deletions src/dev/flang/fe/SourceModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -1020,7 +1020,7 @@ void addDeclaredInnerFeature(AbstractFeature outer, Feature f)
}
else
{
AstErrors.duplicateFeatureDeclaration(f.pos(), f, existing);
AstErrors.duplicateFeatureDeclaration(f, existing);
}
}
}
Expand Down Expand Up @@ -1901,7 +1901,7 @@ private void checkDuplicateFeatures(AbstractFeature outer, FeatureName fn, List<
else
{
// NYI: if (!isInherited && !sameModule(f, outer))
AstErrors.duplicateFeatureDeclaration(f1.pos(), f1, f2);
AstErrors.duplicateFeatureDeclaration(f1, f2);
}
}
}
Expand Down
2 changes: 0 additions & 2 deletions tests/reg_issue3647/reg_issue3647.fz
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
#
# -----------------------------------------------------------------------

# NYI: BUG: should not display error twice.

reg_issue3647 =>

Node(T Type, a Node T) ref is
Expand Down
16 changes: 3 additions & 13 deletions tests/reg_issue3647/reg_issue3647.fz.expected_err
Original file line number Diff line number Diff line change
@@ -1,21 +1,11 @@

--CURDIR--/reg_issue3647.fz:28:23: error 1: Duplicate feature declaration
--CURDIR--/reg_issue3647.fz:26:23: error 1: Duplicate feature declaration
Node(T Type, a Node T) ref is
----------------------^
Feature that was declared repeatedly: 'reg_issue3647.Node.T'
originally declared at --CURDIR--/reg_issue3647.fz:28:8:
originally declared at --CURDIR--/reg_issue3647.fz:26:8:
Node(T Type, a Node T) ref is
-------^
To solve this, consider renaming one of these two features, e.g., as 'Tʼ' (using a unicode modifier letter apostrophe 'ʼ' U+02BC) or adding an additional argument (e.g. '_ unit' for an ignored unit argument used only to disambiguate these two).


--CURDIR--/reg_issue3647.fz:28:8: error 2: Duplicate feature declaration
Node(T Type, a Node T) ref is
-------^
Feature that was declared repeatedly: 'reg_issue3647.Node.T'
originally declared at --CURDIR--/reg_issue3647.fz:28:23:
Node(T Type, a Node T) ref is
----------------------^
To solve this, consider renaming one of these two features, e.g., as 'Tʼ' (using a unicode modifier letter apostrophe 'ʼ' U+02BC) or adding an additional argument (e.g. '_ unit' for an ignored unit argument used only to disambiguate these two).

2 errors.
one error.

0 comments on commit bfd0574

Please sign in to comment.