@@ -71,6 +71,12 @@ public List<Referable> getContext() {
71
71
return myContext ;
72
72
}
73
73
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
+
74
80
@ Override
75
81
public @ NotNull ConcreteExpression resolve (@ NotNull ConcreteExpression expression ) {
76
82
if (!(expression instanceof Concrete .Expression )) {
@@ -140,6 +146,19 @@ public void registerDeclaration(@NotNull ArendRef ref) {
140
146
}
141
147
}
142
148
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
+
143
162
@ Override
144
163
public boolean isLongUnresolvedReference (@ NotNull ArendRef ref ) {
145
164
return ref instanceof LongUnresolvedReference && ((LongUnresolvedReference ) ref ).getPath ().size () > 1 ;
@@ -230,21 +249,25 @@ void resolveLocal(Concrete.ReferenceExpression expr) {
230
249
}
231
250
}
232
251
233
- private Referable convertChecked (Referable origRef , Object data ) {
252
+ private Referable convertChecked (Referable origRef , Object data , boolean reportError ) {
234
253
if (origRef instanceof ErrorReference ) {
235
254
return origRef ;
236
255
}
237
256
Referable ref = myReferableConverter .convert (origRef );
238
257
if (ref != null ) {
239
258
return ref ;
240
259
}
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
+ }
244
267
}
245
268
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 ;
248
271
while (origRef instanceof RedirectingReferable ) {
249
272
origRef = ((RedirectingReferable ) origRef ).getOriginalReferable ();
250
273
}
@@ -256,14 +279,18 @@ Referable convertReferable(Referable referable, Object data) {
256
279
return referable ;
257
280
}
258
281
259
- origRef = convertChecked (origRef , data );
282
+ origRef = convertChecked (origRef , data , reportError );
260
283
if (referable instanceof RedirectingReferable ) {
261
284
return new RedirectingReferableImpl (origRef , ((RedirectingReferable ) referable ).getPrecedence (), referable .textRepresentation ());
262
285
} else {
263
286
return origRef ;
264
287
}
265
288
}
266
289
290
+ Referable convertReferable (Referable referable , Object data ) {
291
+ return convertReferable (referable , data , true );
292
+ }
293
+
267
294
private void convertExpr (Concrete .ReferenceExpression expr ) {
268
295
if (expr .getReferent () instanceof GlobalReferable && !(expr .getReferent () instanceof TCDefReferable )) {
269
296
expr .setReferent (convertReferable (expr .getReferent (), expr .getData ()));
@@ -814,7 +841,7 @@ public void resolvePattern(Concrete.Pattern pattern) {
814
841
Referable origReferable = ((Concrete .ConstructorPattern ) pattern ).getConstructor ();
815
842
if (origReferable instanceof UnresolvedReference ) {
816
843
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 );
818
845
if (referable instanceof ErrorReference ) {
819
846
myErrorReporter .report (((ErrorReference ) referable ).getError ());
820
847
} else if (referable instanceof GlobalReferable && !((GlobalReferable ) referable ).getKind ().isConstructor ()) {
@@ -902,7 +929,7 @@ Referable visitClassFieldReference(Concrete.ClassElement element, Referable oldF
902
929
if (field instanceof ErrorReference ) {
903
930
myErrorReporter .report (((ErrorReference ) field ).getError ());
904
931
} else if (field instanceof GlobalReferable && !(field instanceof TCDefReferable )) {
905
- field = convertChecked (field , ((UnresolvedReference ) oldField ).getData ());
932
+ field = convertChecked (field , ((UnresolvedReference ) oldField ).getData (), true );
906
933
}
907
934
if (element instanceof Concrete .CoClauseElement ) {
908
935
((Concrete .CoClauseElement ) element ).setImplementedField (field );
0 commit comments