private void verifyExtensionInterfaces( PsiElement element, AnnotationHolder holder ) { if( element instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)element).getTreeParent() instanceof ReferenceListElement && ((PsiJavaCodeReferenceElementImpl)element).getTreeParent().getText().startsWith( PsiKeyword.IMPLEMENTS ) ) { final PsiElement resolve = element.getReference().resolve(); if( resolve instanceof PsiExtensibleClass ) { PsiExtensibleClass iface = (PsiExtensibleClass)resolve; if( !isStructuralInterface( iface ) ) { TextRange range = new TextRange( element.getTextRange().getStartOffset(), element.getTextRange().getEndOffset() ); holder.createErrorAnnotation( range, ExtIssueMsg.MSG_ONLY_STRUCTURAL_INTERFACE_ALLOWED_HERE.get( iface.getName() ) ); } } } }
@Nullable private PsiJavaCodeReferenceElement getStaticReference() { final PsiJavaCodeReferenceElement refElement = createReference(); if (refElement == null) return null; if (isOnDemand() && refElement instanceof PsiJavaCodeReferenceElementImpl) { ((PsiJavaCodeReferenceElementImpl)refElement).setKindWhenDummy(PsiJavaCodeReferenceElementImpl.CLASS_FQ_NAME_KIND); } return refElement; }
@Nullable private PsiJavaCodeReferenceElement getRegularReference() { final PsiJavaCodeReferenceElement refElement = createReference(); if (refElement == null) return null; ((PsiJavaCodeReferenceElementImpl)refElement).setKindWhenDummy( isOnDemand() ? PsiJavaCodeReferenceElementImpl.CLASS_FQ_OR_PACKAGE_NAME_KIND : PsiJavaCodeReferenceElementImpl.CLASS_FQ_NAME_KIND); return refElement; }
static boolean isClassNamePossible(CompletionParameters parameters) { boolean isSecondCompletion = parameters.getInvocationCount() >= 2; PsiElement position = parameters.getPosition(); if (JavaKeywordCompletion.isInstanceofPlace(position)) return false; final PsiElement parent = position.getParent(); if (!(parent instanceof PsiJavaCodeReferenceElement)) return isSecondCompletion; if (((PsiJavaCodeReferenceElement)parent).getQualifier() != null) return isSecondCompletion; if (parent instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)parent).getKind(parent.getContainingFile()) == PsiJavaCodeReferenceElementImpl.PACKAGE_NAME_KIND) { return false; } PsiElement grand = parent.getParent(); if (grand instanceof PsiSwitchLabelStatement) { return false; } if (psiElement().inside(PsiImportStatement.class).accepts(parent)) { return isSecondCompletion; } if (grand instanceof PsiAnonymousClass) { grand = grand.getParent(); } if (grand instanceof PsiNewExpression && ((PsiNewExpression)grand).getQualifier() != null) { return false; } if (JavaKeywordCompletion.isAfterPrimitiveOrArrayType(position)) { return false; } return true; }
static boolean isClassNamePossible(CompletionParameters parameters) { boolean isSecondCompletion = parameters.getInvocationCount() >= 2; PsiElement position = parameters.getPosition(); if (JavaCompletionData.isInstanceofPlace(position)) return false; final PsiElement parent = position.getParent(); if (!(parent instanceof PsiJavaCodeReferenceElement)) return isSecondCompletion; if (((PsiJavaCodeReferenceElement)parent).getQualifier() != null) return isSecondCompletion; if (parent instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)parent).getKind() == PsiJavaCodeReferenceElementImpl.PACKAGE_NAME_KIND) { return false; } PsiElement grand = parent.getParent(); if (grand instanceof PsiSwitchLabelStatement) { return false; } if (psiElement().inside(PsiImportStatement.class).accepts(parent)) { return isSecondCompletion; } if (grand instanceof PsiAnonymousClass) { grand = grand.getParent(); } if (grand instanceof PsiNewExpression && ((PsiNewExpression)grand).getQualifier() != null) { return false; } if (JavaCompletionData.isAfterPrimitiveOrArrayType(position)) { return false; } return true; }
@Override public PsiClassType[] getReferencedTypes() { if (myTypes != null) return myTypes; if (myNames.length == 0) { myTypes = PsiClassType.EMPTY_ARRAY; return myTypes; } PsiClassType[] types = new PsiClassType[myNames.length]; final boolean compiled = ((JavaClassReferenceListElementType)getStubType()).isCompiled(this); if (compiled) { for (int i = 0; i < types.length; i++) { types[i] = new PsiClassReferenceType(new ClsJavaCodeReferenceElementImpl(getPsi(), StringRef.toString(myNames[i])), null); } } else { final PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); int nullCount = 0; final PsiReferenceList psi = getPsi(); for (int i = 0; i < types.length; i++) { PsiElement context = psi; if (getParentStub() instanceof PsiClassStub) { context = ((PsiClassImpl)getParentStub().getPsi()).calcBasesResolveContext(PsiNameHelper.getShortClassName(StringRef.toString(myNames[i])), psi); } try { final PsiJavaCodeReferenceElement ref = factory.createReferenceFromText(StringRef.toString(myNames[i]), context); ((PsiJavaCodeReferenceElementImpl)ref).setKindWhenDummy(PsiJavaCodeReferenceElementImpl.CLASS_NAME_KIND); types[i] = factory.createType(ref); } catch (IncorrectOperationException e) { types[i] = null; nullCount++; } } if (nullCount > 0) { PsiClassType[] newTypes = new PsiClassType[types.length - nullCount]; int cnt = 0; for (PsiClassType type : types) { if (type != null) newTypes[cnt++] = type; } types = newTypes; } } myTypes = types; return types; }
@Nullable public static PsiClass resolveClass(@NotNull PsiJavaCodeReferenceElement ref, @NotNull PsiFile containingFile) { if (ref instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)ref).getKind(containingFile) == PsiJavaCodeReferenceElementImpl.CLASS_IN_QUALIFIED_NEW_KIND) { PsiElement parent = ref.getParent(); if (parent instanceof PsiAnonymousClass){ parent = parent.getParent(); } PsiExpression qualifier; if (parent instanceof PsiNewExpression){ qualifier = ((PsiNewExpression)parent).getQualifier(); LOG.assertTrue(qualifier != null); } else if (parent instanceof PsiJavaCodeReferenceElement){ return null; } else{ LOG.assertTrue(false); return null; } PsiType qualifierType = qualifier.getType(); if (qualifierType == null) return null; if (!(qualifierType instanceof PsiClassType)) return null; PsiClass qualifierClass = PsiUtil.resolveClassInType(qualifierType); if (qualifierClass == null) return null; String name = ref.getText(); return qualifierClass.findInnerClassByName(name, true); } final PsiElement classNameElement = ref.getReferenceNameElement(); if (!(classNameElement instanceof PsiIdentifier)) return null; String className = classNameElement.getText(); /* long time1 = System.currentTimeMillis(); */ ClassResolverProcessor processor = new ClassResolverProcessor(className, ref, containingFile); PsiScopesUtil.resolveAndWalk(processor, ref, null); /* long time2 = System.currentTimeMillis(); Statistics.resolveClassTime += (time2 - time1); Statistics.resolveClassCount++; */ return processor.getResult().length == 1 ? (PsiClass)processor.getResult()[0].getElement() : null; }
@Nullable public static PsiClass resolveClass(PsiJavaCodeReferenceElement ref) { if (ref instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl)ref).getKind() == PsiJavaCodeReferenceElementImpl.CLASS_IN_QUALIFIED_NEW_KIND) { PsiElement parent = ref.getParent(); if (parent instanceof PsiAnonymousClass){ parent = parent.getParent(); } PsiExpression qualifier; if (parent instanceof PsiNewExpression){ qualifier = ((PsiNewExpression)parent).getQualifier(); LOG.assertTrue(qualifier != null); } else if (parent instanceof PsiJavaCodeReferenceElement){ return null; } else{ LOG.assertTrue(false); return null; } PsiType qualifierType = qualifier.getType(); if (qualifierType == null) return null; if (!(qualifierType instanceof PsiClassType)) return null; PsiClass qualifierClass = PsiUtil.resolveClassInType(qualifierType); if (qualifierClass == null) return null; String name = ref.getText(); return qualifierClass.findInnerClassByName(name, true); } final PsiElement classNameElement = ref.getReferenceNameElement(); if (!(classNameElement instanceof PsiIdentifier)) return null; String className = classNameElement.getText(); /* long time1 = System.currentTimeMillis(); */ ClassResolverProcessor processor = new ClassResolverProcessor(className, ref, ref.getContainingFile()); PsiScopesUtil.resolveAndWalk(processor, ref, null); /* long time2 = System.currentTimeMillis(); Statistics.resolveClassTime += (time2 - time1); Statistics.resolveClassCount++; */ return processor.getResult().length == 1 ? (PsiClass)processor.getResult()[0].getElement() : null; }
@NotNull @Override public PsiClassType[] getReferencedTypes() { if(myTypes != null) { return myTypes; } if(myNames.length == 0) { myTypes = PsiClassType.EMPTY_ARRAY; return myTypes; } PsiClassType[] types = new PsiClassType[myNames.length]; final boolean compiled = ((JavaClassReferenceListElementType) getStubType()).isCompiled(this); if(compiled) { for(int i = 0; i < types.length; i++) { types[i] = new PsiClassReferenceType(new ClsJavaCodeReferenceElementImpl(getPsi(), myNames[i]), null); } } else { final PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); int nullCount = 0; final PsiReferenceList psi = getPsi(); for(int i = 0; i < types.length; i++) { try { final PsiJavaCodeReferenceElement ref = factory.createReferenceFromText(myNames[i], psi); ((PsiJavaCodeReferenceElementImpl) ref).setKindWhenDummy(PsiJavaCodeReferenceElementImpl.CLASS_NAME_KIND); types[i] = factory.createType(ref); } catch(IncorrectOperationException e) { types[i] = null; nullCount++; } } if(nullCount > 0) { PsiClassType[] newTypes = new PsiClassType[types.length - nullCount]; int cnt = 0; for(PsiClassType type : types) { if(type != null) { newTypes[cnt++] = type; } } types = newTypes; } } myTypes = types; return types.clone(); }
@Nullable public static PsiClass resolveClass(@NotNull PsiJavaCodeReferenceElement ref, @NotNull PsiFile containingFile) { if(ref instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl) ref).getKind(containingFile) == PsiJavaCodeReferenceElementImpl.CLASS_IN_QUALIFIED_NEW_KIND) { PsiElement parent = ref.getParent(); if(parent instanceof PsiAnonymousClass) { parent = parent.getParent(); } PsiExpression qualifier; if(parent instanceof PsiNewExpression) { qualifier = ((PsiNewExpression) parent).getQualifier(); LOG.assertTrue(qualifier != null); } else if(parent instanceof PsiJavaCodeReferenceElement) { return null; } else { LOG.assertTrue(false); return null; } PsiType qualifierType = qualifier.getType(); if(qualifierType == null) { return null; } if(!(qualifierType instanceof PsiClassType)) { return null; } PsiClass qualifierClass = PsiUtil.resolveClassInType(qualifierType); if(qualifierClass == null) { return null; } String name = ref.getText(); return qualifierClass.findInnerClassByName(name, true); } final PsiElement classNameElement = ref.getReferenceNameElement(); if(!(classNameElement instanceof PsiIdentifier)) { return null; } String className = classNameElement.getText(); /* long time1 = System.currentTimeMillis(); */ ClassResolverProcessor processor = new ClassResolverProcessor(className, ref, containingFile); PsiScopesUtil.resolveAndWalk(processor, ref, null); /* long time2 = System.currentTimeMillis(); Statistics.resolveClassTime += (time2 - time1); Statistics.resolveClassCount++; */ return processor.getResult().length == 1 ? (PsiClass) processor.getResult()[0].getElement() : null; }
static boolean isClassNamePossible(CompletionParameters parameters) { boolean isSecondCompletion = parameters.getInvocationCount() >= 2; PsiElement position = parameters.getPosition(); if(JavaKeywordCompletion.isInstanceofPlace(position) || JavaMemberNameCompletionContributor.INSIDE_TYPE_PARAMS_PATTERN.accepts(position)) { return false; } final PsiElement parent = position.getParent(); if(!(parent instanceof PsiJavaCodeReferenceElement)) { return isSecondCompletion; } if(((PsiJavaCodeReferenceElement) parent).getQualifier() != null) { return isSecondCompletion; } if(parent instanceof PsiJavaCodeReferenceElementImpl && ((PsiJavaCodeReferenceElementImpl) parent).getKind(parent.getContainingFile()) == PsiJavaCodeReferenceElementImpl.PACKAGE_NAME_KIND) { return false; } PsiElement grand = parent.getParent(); if(grand instanceof PsiSwitchLabelStatement) { return false; } if(psiElement().inside(PsiImportStatement.class).accepts(parent)) { return isSecondCompletion; } if(grand instanceof PsiAnonymousClass) { grand = grand.getParent(); } if(grand instanceof PsiNewExpression && ((PsiNewExpression) grand).getQualifier() != null) { return false; } if(JavaKeywordCompletion.isAfterPrimitiveOrArrayType(position)) { return false; } return true; }