private static List<? extends PsiElement> resolveSimpleReference( @NotNull DartReference reference) { final List<? extends PsiElement> result = resolveSimpleReference(reference, reference.getCanonicalText()); final PsiElement parent = reference.getParent(); final PsiElement superParent = parent.getParent(); final boolean isSimpleConstructor = parent instanceof DartType && superParent instanceof DartNewExpression && ((DartNewExpression) superParent).getReferenceExpression() == null; if (!isSimpleConstructor || result.isEmpty()) { return result; } final List<PsiElement> filteredResult = new ArrayList<PsiElement>(result.size()); for (PsiElement element : result) { final PsiElement elementParent = element.getParent(); if (element instanceof DartComponentName && elementParent instanceof DartClass) { final DartComponent component = ((DartClass) elementParent).findNamedConstructor(reference.getCanonicalText()); if (component != null && DartComponentType.typeOf(component) == DartComponentType.CONSTRUCTOR) { filteredResult.add(component.getComponentName()); continue; } } filteredResult.add(element); } return filteredResult; }
@Nullable @Override public List<? extends PsiElement> resolve( @NotNull DartReference reference, boolean incompleteCode) { if (reference instanceof DartThisExpression) { return toResult(PsiTreeUtil.getParentOfType(reference, DartClass.class)); } if (reference instanceof DartParameterNameReferenceExpression) { final DartCallExpression callExpression = PsiTreeUtil.getParentOfType(reference, DartCallExpression.class); final DartExpression expression = callExpression != null ? callExpression.getExpression() : null; final PsiElement target = expression instanceof DartReference ? ((DartReference) expression).resolve() : null; final DartFormalParameterList parameters = PsiTreeUtil.getChildOfType( target != null ? target.getParent() : null, DartFormalParameterList.class); return toResult(DartResolveUtil.findParameterByName(parameters, reference.getText())); } if (DartResolveUtil.aloneOrFirstInChain(reference)) { return resolveSimpleReference(reference); } final DartReference leftReference = DartResolveUtil.getLeftReference(reference); // reference [node, node] final DartReference[] references = PsiTreeUtil.getChildrenOfType(reference, DartReference.class); if (references != null && references.length == 2) { // prefix final List<DartComponentName> names = DartResolveUtil.findComponentsInLibraryByPrefix( reference, references[0].getCanonicalText(), references[1].getCanonicalText()); if (!names.isEmpty()) { return toResult(names); } return toResult(references[1].resolve()); } else if (leftReference != null) { final DartClassResolveResult classResolveResult = leftReference.resolveDartClass(); final DartClass dartClass = classResolveResult.getDartClass(); if (dartClass != null) { final String name = reference.getCanonicalText(); final DartComponent subComponent = leftReference instanceof DartType ? dartClass.findNamedConstructor(name) : filterAccess(reference, dartClass.findMembersByName(name)); return toResult(subComponent == null ? null : subComponent.getComponentName()); } // prefix final List<DartComponentName> names = DartResolveUtil.findComponentsInLibraryByPrefix( reference, leftReference.getCanonicalText(), reference.getCanonicalText()); if (!names.isEmpty()) { return toResult(names); } } return null; }