Skip to content

Commit 679026c

Browse files
committed
Add some functions to resolver API
1 parent 95c511a commit 679026c

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

api/src/main/java/org/arend/ext/reference/ExpressionResolver.java

+15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
import java.util.Set;
1111

1212
public interface ExpressionResolver {
13+
/**
14+
* Resolves the specified short name.
15+
*/
16+
@Nullable ArendRef resolveName(@NotNull String name);
17+
1318
/**
1419
* Resolves names in the given expression.
1520
*/
@@ -40,6 +45,16 @@ public interface ExpressionResolver {
4045
*/
4146
void registerDeclaration(@NotNull ArendRef ref);
4247

48+
/**
49+
* @return the original reference of a redirecting one.
50+
*/
51+
@NotNull ArendRef getOriginalRef(@NotNull ArendRef ref);
52+
53+
/**
54+
* Checks if {@code ref} is unresolved.
55+
*/
56+
boolean isUnresolved(@NotNull ArendRef ref);
57+
4358
/**
4459
* Checks if {@code ref} is unresolved and contains more than 1 name separated by dots.
4560
*/

base/src/main/java/org/arend/naming/resolving/visitor/ExpressionResolveNameVisitor.java

+36-9
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ public List<Referable> getContext() {
7171
return myContext;
7272
}
7373

74+
@Override
75+
public @Nullable ArendRef resolveName(@NotNull String name) {
76+
Referable result = tryResolve(new NamedUnresolvedReference(null, name), myScope, null);
77+
return result != null && !(result instanceof NamedUnresolvedReference) ? convertReferable(result, null, false) : null;
78+
}
79+
7480
@Override
7581
public @NotNull ConcreteExpression resolve(@NotNull ConcreteExpression expression) {
7682
if (!(expression instanceof Concrete.Expression)) {
@@ -140,6 +146,19 @@ public void registerDeclaration(@NotNull ArendRef ref) {
140146
}
141147
}
142148

149+
@Override
150+
public @NotNull ArendRef getOriginalRef(@NotNull ArendRef ref) {
151+
while (ref instanceof RedirectingReferable) {
152+
ref = ((RedirectingReferable) ref).getOriginalReferable();
153+
}
154+
return ref;
155+
}
156+
157+
@Override
158+
public boolean isUnresolved(@NotNull ArendRef ref) {
159+
return ref instanceof UnresolvedReference;
160+
}
161+
143162
@Override
144163
public boolean isLongUnresolvedReference(@NotNull ArendRef ref) {
145164
return ref instanceof LongUnresolvedReference && ((LongUnresolvedReference) ref).getPath().size() > 1;
@@ -230,21 +249,25 @@ void resolveLocal(Concrete.ReferenceExpression expr) {
230249
}
231250
}
232251

233-
private Referable convertChecked(Referable origRef, Object data) {
252+
private Referable convertChecked(Referable origRef, Object data, boolean reportError) {
234253
if (origRef instanceof ErrorReference) {
235254
return origRef;
236255
}
237256
Referable ref = myReferableConverter.convert(origRef);
238257
if (ref != null) {
239258
return ref;
240259
}
241-
NameResolverError error = new NameResolverError("Invalid reference", data);
242-
myErrorReporter.report(error);
243-
return new ErrorReference(error, origRef.getRefName());
260+
if (reportError) {
261+
NameResolverError error = new NameResolverError("Invalid reference", data);
262+
myErrorReporter.report(error);
263+
return new ErrorReference(error, origRef.getRefName());
264+
} else {
265+
return null;
266+
}
244267
}
245268

246-
Referable convertReferable(Referable referable, Object data) {
247-
Referable origRef = referable instanceof RedirectingReferable ? ((RedirectingReferable) referable).getOriginalReferable() : referable;
269+
private Referable convertReferable(Referable referable, Object data, boolean reportError) {
270+
Referable origRef = referable;
248271
while (origRef instanceof RedirectingReferable) {
249272
origRef = ((RedirectingReferable) origRef).getOriginalReferable();
250273
}
@@ -256,14 +279,18 @@ Referable convertReferable(Referable referable, Object data) {
256279
return referable;
257280
}
258281

259-
origRef = convertChecked(origRef, data);
282+
origRef = convertChecked(origRef, data, reportError);
260283
if (referable instanceof RedirectingReferable) {
261284
return new RedirectingReferableImpl(origRef, ((RedirectingReferable) referable).getPrecedence(), referable.textRepresentation());
262285
} else {
263286
return origRef;
264287
}
265288
}
266289

290+
Referable convertReferable(Referable referable, Object data) {
291+
return convertReferable(referable, data, true);
292+
}
293+
267294
private void convertExpr(Concrete.ReferenceExpression expr) {
268295
if (expr.getReferent() instanceof GlobalReferable && !(expr.getReferent() instanceof TCDefReferable)) {
269296
expr.setReferent(convertReferable(expr.getReferent(), expr.getData()));
@@ -814,7 +841,7 @@ public void resolvePattern(Concrete.Pattern pattern) {
814841
Referable origReferable = ((Concrete.ConstructorPattern) pattern).getConstructor();
815842
if (origReferable instanceof UnresolvedReference) {
816843
List<Referable> resolvedList = myResolverListener == null ? null : new ArrayList<>();
817-
Referable referable = convertChecked(resolve(origReferable, myParentScope, false, resolvedList, Referable.RefKind.EXPR), ((UnresolvedReference) origReferable).getData());
844+
Referable referable = convertChecked(resolve(origReferable, myParentScope, false, resolvedList, Referable.RefKind.EXPR), ((UnresolvedReference) origReferable).getData(), true);
818845
if (referable instanceof ErrorReference) {
819846
myErrorReporter.report(((ErrorReference) referable).getError());
820847
} else if (referable instanceof GlobalReferable && !((GlobalReferable) referable).getKind().isConstructor()) {
@@ -902,7 +929,7 @@ Referable visitClassFieldReference(Concrete.ClassElement element, Referable oldF
902929
if (field instanceof ErrorReference) {
903930
myErrorReporter.report(((ErrorReference) field).getError());
904931
} else if (field instanceof GlobalReferable && !(field instanceof TCDefReferable)) {
905-
field = convertChecked(field, ((UnresolvedReference) oldField).getData());
932+
field = convertChecked(field, ((UnresolvedReference) oldField).getData(), true);
906933
}
907934
if (element instanceof Concrete.CoClauseElement) {
908935
((Concrete.CoClauseElement) element).setImplementedField(field);

0 commit comments

Comments
 (0)