PsiType () { PsiType inferredType = PsiAugmentProvider.getInferredType(this); if (inferredType != null) { return inferredType; } PsiType type = null; boolean ellipsis = false; List<PsiAnnotation> annotations = new SmartList<>(); List<TypeAnnotationProvider> arrayComponentAnnotations = new SmartList<>(); PsiElement parent = getParent(); PsiElement firstChild = getFirstChild(); if (firstChild == null && parent instanceof PsiUnnamedPattern) { type = JavaPsiPatternUtil.getDeconstructedImplicitPatternType((PsiPattern)parent); } for (PsiElement child = firstChild; child != null; child = child.getNextSibling()) { if (child instanceof PsiComment || child instanceof PsiWhiteSpace) continue; if (child instanceof PsiAnnotation) { annotations.add((PsiAnnotation)child); } else if (child instanceof PsiTypeElement) { assert type == null : this; if (child instanceof PsiDiamondTypeElementImpl) { type = new PsiDiamondTypeImpl(getManager(), this); break; } else { type = ((PsiTypeElement)child).getType(); } } else if (PsiUtil.isJavaToken(child, ElementType.PRIMITIVE_TYPE_BIT_SET)) { assert type == null : this; String text = child.getText(); type = annotations.isEmpty() ? PsiJavaParserFacadeImpl.getPrimitiveType(text) : new PsiPrimitiveType(text, createProvider(annotations)); } else if (PsiUtil.isJavaToken(child, JavaTokenType.VAR_KEYWORD)) { assert type == null : this; type = inferVarType(parent); } else if (child instanceof PsiJavaCodeReferenceElement) { assert type == null : this; type = new PsiClassReferenceType(getReferenceComputable((PsiJavaCodeReferenceElement)child), null, createProvider(annotations)); } else if (PsiUtil.isJavaToken(child, JavaTokenType.LBRACKET)) { assert type != null : this; arrayComponentAnnotations.add(createProvider(annotations)); annotations = new SmartList<>(); } else if (PsiUtil.isJavaToken(child, JavaTokenType.ELLIPSIS)) { assert type != null : this; arrayComponentAnnotations.add(createProvider(annotations)); annotations = new SmartList<>(); ellipsis = true; } if (PsiUtil.isJavaToken(child, JavaTokenType.QUEST) || child instanceof ASTNode && ((ASTNode)child).getElementType() == JavaElementType.DUMMY_ELEMENT && "any".equals(child.getText())) { assert type == null : this; PsiElement boundKind = PsiTreeUtil.skipWhitespacesAndCommentsForward(child); PsiElement boundType = PsiTreeUtil.skipWhitespacesAndCommentsForward(boundKind); if (PsiUtil.isJavaToken(boundKind, JavaTokenType.EXTENDS_KEYWORD) && boundType instanceof PsiTypeElement) { type = PsiWildcardType.createExtends(getManager(), ((PsiTypeElement)boundType).getType()); } else if (PsiUtil.isJavaToken(boundKind, JavaTokenType.SUPER_KEYWORD) && boundType instanceof PsiTypeElement) { type = PsiWildcardType.createSuper(getManager(), ((PsiTypeElement)boundType).getType()); } else { type = PsiWildcardType.createUnbounded(getManager()); } type = type.annotate(createProvider(annotations)); break; } if (PsiUtil.isJavaToken(child, JavaTokenType.AND)) { List<PsiType> types = collectTypes(); assert !types.isEmpty() : this; type = PsiIntersectionType.createIntersection(false, types.toArray(PsiType.createArray(types.size()))); break; } if (PsiUtil.isJavaToken(child, JavaTokenType.OR)) { List<PsiType> types = collectTypes(); assert !types.isEmpty() : this; type = PsiDisjunctionType.createDisjunction(types, getManager()); break; } } if (type == null) return PsiTypes.nullType(); if (!arrayComponentAnnotations.isEmpty()) { type = createArray(type, arrayComponentAnnotations, ellipsis); } if (parent instanceof PsiModifierListOwner) { type = JavaSharedImplUtil.applyAnnotations(type, ((PsiModifierListOwner)parent).getModifierList()); } return type; }