Search in sources :

Example 1 with JSType

use of com.intellij.lang.javascript.psi.JSType in project intellij-plugins by JetBrains.

the class AngularBindingDescriptor method createOneTimeBinding.

@Nullable
private static AngularBindingDescriptor createOneTimeBinding(Pair<PsiElement, String> dom) {
    PsiElement element = dom.first;
    if (element instanceof JSImplicitElement) {
        String type = ((JSImplicitElement) element).getTypeString();
        if (type != null && (type.endsWith("String") || type.endsWith("Object"))) {
            return new AngularBindingDescriptor(element, dom.second);
        }
    }
    final JSType type = expandStringLiteralTypes(element instanceof JSFunction ? ((JSFunction) element).getReturnType() : element instanceof JSField ? ((JSField) element).getType() : null);
    return type != null && type.isDirectlyAssignableType(STRING_TYPE, null) ? new AngularBindingDescriptor(element, dom.second) : null;
}
Also used : JSType(com.intellij.lang.javascript.psi.JSType) JSFunction(com.intellij.lang.javascript.psi.JSFunction) JSField(com.intellij.lang.javascript.psi.JSField) JSImplicitElement(com.intellij.lang.javascript.psi.stubs.JSImplicitElement) PsiElement(com.intellij.psi.PsiElement) Nullable(org.jetbrains.annotations.Nullable)

Example 2 with JSType

use of com.intellij.lang.javascript.psi.JSType in project oxy-template-support-plugin by mutant-industries.

the class JavaContext method fillCompletionVariants.

@Override
public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull CompletionResultSet result) {
    Module module;
    PsiElement element = parameters.getOriginalFile().getViewProvider().findElementAt(parameters.getOffset() - 1, OxyTemplateInnerJs.INSTANCE);
    if (element == null || element.getNode().getElementType() != JSTokenTypes.DOT && (element = element.getPrevSibling()) == null) {
        return;
    }
    if (element.getNode().getElementType() == TokenType.WHITE_SPACE) {
        element = element.getPrevSibling();
    }
    while (element != null && element.getNode().getElementType() != JSTokenTypes.DOT) {
        element = element.getLastChild();
        if (element instanceof PsiErrorElement) {
            element = element.getPrevSibling();
        }
    }
    if (element == null || element.getNode().getElementType() != JSTokenTypes.DOT || (element = element.getPrevSibling()) == null) {
        return;
    }
    if (element.getNode().getElementType() == TokenType.WHITE_SPACE) {
        element = element.getPrevSibling();
    }
    if (!(element instanceof JSExpression) || (module = ModuleUtilCore.findModuleForPsiElement(parameters.getOriginalFile())) == null) {
        return;
    }
    JSSimpleTypeProcessor typeProcessor = new JSSimpleTypeProcessor();
    JSTypeEvaluator.evaluateTypes((JSExpression) element, parameters.getOriginalFile().getViewProvider().getPsi(OxyTemplateInnerJs.INSTANCE), typeProcessor);
    JSType type = typeProcessor.getType();
    List<String> possibleJavaTypes = new LinkedList<>();
    if (type != null) {
        if (type instanceof JSCompositeTypeImpl) {
            possibleJavaTypes.addAll(((JSCompositeTypeImpl) type).getTypes().stream().filter(jsType -> jsType instanceof JSTypeImpl).map(JSType::getTypeText).collect(Collectors.toList()));
        } else if (type instanceof JSTypeImpl) {
            possibleJavaTypes.add(type.getTypeText());
        }
    }
    JavaPsiFacade facade = JavaPsiFacade.getInstance(parameters.getOriginalFile().getProject());
    GlobalSearchScope scope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(module);
    List<PsiClass> possibleInstancesOf = new LinkedList<>();
    boolean suggestionsFound = false;
    PsiClass aClass;
    for (String possibleType : possibleJavaTypes) {
        if ((aClass = facade.findClass(possibleType, scope)) != null) {
            possibleInstancesOf.add(aClass);
            possibleInstancesOf.addAll(ExtenderProvider.getExtenders(aClass));
        }
    }
    for (PsiClass psiClass : possibleInstancesOf) {
        List<String> alreadySuggested = new LinkedList<>();
        for (PsiMethod method : psiClass.getAllMethods()) {
            if (method.getContainingClass() == null || Object.class.getName().equals(method.getContainingClass().getQualifiedName()) || method.getReturnType() == null || shippedBaseExtenderMethods.contains(method.getName()) || !method.getModifierList().hasModifierProperty(PsiModifier.PUBLIC) || InheritanceUtil.isInheritor(method.getContainingClass(), EXTENDER_INTERFACE_FQN) && !InheritanceUtil.isInheritor(method.getContainingClass(), EXTENDER_BASE_CLASS_FQN)) {
                continue;
            }
            String insertText = method.getName();
            String presentableText = method.getName();
            if (insertText.matches("((^is)|(^get)|(^set))[A-Z].*")) {
                insertText = presentableText = StringUtils.decapitalize(insertText.replaceFirst("(^is)|(^get)|(^set)", ""));
            } else {
                presentableText = method.getPresentation() == null ? presentableText + "()" : method.getPresentation().getPresentableText();
                insertText += "()";
            }
            if (alreadySuggested.contains(insertText)) {
                continue;
            }
            result.consume(LookupElementBuilder.create(method, insertText).withIcon(method.getIcon(0)).withTypeText(method.getReturnType().getPresentableText(), true).withTailText(" (" + psiClass.getContainingFile().getName() + ")", true).withPresentableText(presentableText).withInsertHandler(new TrailingPatternConsumer(INSERT_CONSUME)).withAutoCompletionPolicy(AutoCompletionPolicy.GIVE_CHANCE_TO_OVERWRITE));
            alreadySuggested.add(insertText);
            suggestionsFound = true;
        }
    }
    if (suggestionsFound) {
        result.stopHere();
    }
}
Also used : Arrays(java.util.Arrays) PsiErrorElement(com.intellij.psi.PsiErrorElement) JSTypeEvaluator(com.intellij.lang.javascript.psi.resolve.JSTypeEvaluator) StringUtils(com.sun.xml.internal.ws.util.StringUtils) JavaPsiFacade(com.intellij.psi.JavaPsiFacade) CompletionParameters(com.intellij.codeInsight.completion.CompletionParameters) JSCompositeTypeImpl(com.intellij.lang.javascript.psi.types.JSCompositeTypeImpl) Extender(ool.web.model.Extender) TokenType(com.intellij.psi.TokenType) PsiModifier(com.intellij.psi.PsiModifier) CompletionResultSet(com.intellij.codeInsight.completion.CompletionResultSet) CompletionContributor(com.intellij.codeInsight.completion.CompletionContributor) PsiClass(com.intellij.psi.PsiClass) JSTokenTypes(com.intellij.lang.javascript.JSTokenTypes) PsiElement(com.intellij.psi.PsiElement) InheritanceUtil(com.intellij.psi.util.InheritanceUtil) JSExpression(com.intellij.lang.javascript.psi.JSExpression) JSType(com.intellij.lang.javascript.psi.JSType) LinkedList(java.util.LinkedList) Module(com.intellij.openapi.module.Module) OxyTemplateInnerJs(ool.intellij.plugin.lang.OxyTemplateInnerJs) JSSimpleTypeProcessor(com.intellij.lang.javascript.psi.resolve.JSSimpleTypeProcessor) LookupElementBuilder(com.intellij.codeInsight.lookup.LookupElementBuilder) ModuleUtilCore(com.intellij.openapi.module.ModuleUtilCore) PsiMethod(com.intellij.psi.PsiMethod) ExtenderProvider(ool.intellij.plugin.psi.reference.innerjs.ExtenderProvider) GlobalSearchScope(com.intellij.psi.search.GlobalSearchScope) Collectors(java.util.stream.Collectors) AutoCompletionPolicy(com.intellij.codeInsight.lookup.AutoCompletionPolicy) List(java.util.List) TrailingPatternConsumer(ool.intellij.plugin.editor.completion.handler.TrailingPatternConsumer) Pattern(java.util.regex.Pattern) BaseExtender(ool.web.model.BaseExtender) NotNull(org.jetbrains.annotations.NotNull) JSTypeImpl(com.intellij.lang.javascript.psi.types.JSTypeImpl) JavaPsiFacade(com.intellij.psi.JavaPsiFacade) JSType(com.intellij.lang.javascript.psi.JSType) PsiMethod(com.intellij.psi.PsiMethod) PsiClass(com.intellij.psi.PsiClass) JSExpression(com.intellij.lang.javascript.psi.JSExpression) LinkedList(java.util.LinkedList) PsiErrorElement(com.intellij.psi.PsiErrorElement) JSTypeImpl(com.intellij.lang.javascript.psi.types.JSTypeImpl) JSCompositeTypeImpl(com.intellij.lang.javascript.psi.types.JSCompositeTypeImpl) GlobalSearchScope(com.intellij.psi.search.GlobalSearchScope) TrailingPatternConsumer(ool.intellij.plugin.editor.completion.handler.TrailingPatternConsumer) JSSimpleTypeProcessor(com.intellij.lang.javascript.psi.resolve.JSSimpleTypeProcessor) Module(com.intellij.openapi.module.Module) PsiElement(com.intellij.psi.PsiElement)

Example 3 with JSType

use of com.intellij.lang.javascript.psi.JSType in project intellij-plugins by JetBrains.

the class FlexUnitMethodReturnTypeInspection method visitPotentialTestMethod.

protected void visitPotentialTestMethod(JSFunction method, ProblemsHolder holder, FlexUnitSupport support) {
    if (FlexUnitSupport.getCustomRunner((JSClass) method.getParent()) != null)
        return;
    if (method.getKind() != JSFunction.FunctionKind.SIMPLE)
        return;
    if (support.isFlexUnit1Subclass((JSClass) method.getParent()) || support.isFlunitSubclass((JSClass) method.getParent())) {
        return;
    }
    final JSType returnType = method.getReturnType();
    if (returnType != null && !(returnType instanceof JSVoidType)) {
        final ASTNode nameIdentifier = method.findNameIdentifier();
        if (nameIdentifier != null) {
            LocalQuickFix[] fix = canFix(method) ? new LocalQuickFix[] { new ChangeTypeFix(method, "void", "javascript.fix.set.method.return.type") } : LocalQuickFix.EMPTY_ARRAY;
            holder.registerProblem(nameIdentifier.getPsi(), FlexBundle.message("flexunit.inspection.testmethodreturntype.message"), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, fix);
        }
    }
}
Also used : ChangeTypeFix(com.intellij.lang.javascript.validation.fixes.ChangeTypeFix) JSType(com.intellij.lang.javascript.psi.JSType) ASTNode(com.intellij.lang.ASTNode) LocalQuickFix(com.intellij.codeInspection.LocalQuickFix) JSClass(com.intellij.lang.javascript.psi.ecmal4.JSClass) JSVoidType(com.intellij.lang.javascript.psi.types.primitives.JSVoidType)

Example 4 with JSType

use of com.intellij.lang.javascript.psi.JSType in project oxy-template-support-plugin by mutant-industries.

the class InnerJsTypeEvaluator method addTypeFromAmdModuleReference.

@Override
protected boolean addTypeFromAmdModuleReference(@NotNull JSParameter parameter) {
    JSProperty macro;
    JSType type;
    // macro first parameter
    if ((macro = checkMacroFirstParameter(parameter)) != null) {
        addType(getMacroFirstParameterType(macro), parameter);
        return true;
    } else // function parameter
    if ((type = parameter.getType()) != null) {
        type.accept(new SimplifiedClassNameResolver(myContext.targetFile));
    }
    return super.addTypeFromAmdModuleReference(parameter);
}
Also used : JSType(com.intellij.lang.javascript.psi.JSType) JSProperty(com.intellij.lang.javascript.psi.JSProperty)

Example 5 with JSType

use of com.intellij.lang.javascript.psi.JSType in project oxy-template-support-plugin by mutant-industries.

the class GlobalVariableTypeProvider method compute.

@Nullable
@Override
public Result<JSType> compute() {
    List<PsiElement> cacheDependencies = new LinkedList<>();
    cacheDependencies.add(expression);
    // controllers
    if (CONTROLLERS_GLOBAL_VARIABLE_NAME.equals(name)) {
        Project project = expression.getProject();
        GlobalSearchScope allScope = ProjectScope.getAllScope(project);
        GlobalSearchScope projectScope = ProjectScope.getProjectScope(project);
        List<JSRecordTypeImpl.TypeMember> members = new LinkedList<>();
        JSTypeSource typeSource = JSTypeSourceFactory.createTypeSource(expression, true);
        PsiClass controller;
        PsiClass controllerAnnotation = JavaPsiFacade.getInstance(project).findClass(CONTROLLER_FQN, allScope);
        if (controllerAnnotation != null && controllerAnnotation.isAnnotationType()) {
            for (PsiReference controllerAnnotationReference : ReferencesSearch.search(controllerAnnotation, projectScope).findAll()) {
                PsiElement reference = controllerAnnotationReference.getElement();
                if ((controller = PsiTreeUtil.getParentOfType(reference, PsiClass.class)) != null && controller.getQualifiedName() != null) {
                    JSTypeSource source = JSTypeSourceFactory.createTypeSource(controller, true);
                    JSType jsType = JSTypeUtils.createType(controller.getQualifiedName(), source);
                    JSRecordTypeImpl.PropertySignature signature = new JSRecordTypeImpl.PropertySignatureImpl(controller.getName(), jsType, false);
                    members.add(signature);
                    cacheDependencies.add(controller);
                }
            }
        }
        Collections.addAll(cacheDependencies, FilenameIndex.getFilesByName(project, CONTROLLERS_BEANS_FILE_NAME, ProjectScope.getProjectScope(project)));
        return Result.create(new JSRecordTypeImpl(typeSource, ImmutableList.copyOf(members)), cacheDependencies);
    }
    PsiReturnStatement returnStatement;
    PsiClass aClass;
    PsiElement elementAt;
    // global model provider
    if ((returnStatement = PsiTreeUtil.getParentOfType(expression, PsiReturnStatement.class)) != null && (aClass = PsiTreeUtil.getParentOfType(returnStatement, PsiClass.class)) != null && InheritanceUtil.isInheritor(aClass, GLOBAL_MODEL_PROVIDER_FQN)) {
        return Result.create(getTypeFromProvider(aClass), cacheDependencies);
    } else // model provider registry
    {
        elementAt = expression;
        while (elementAt != null && !((elementAt = elementAt.getNextSibling()) instanceof PsiExpression)) ;
        if (elementAt instanceof PsiNewExpression) {
            PsiJavaCodeReferenceElement providerClassReference = PsiTreeUtil.getNextSiblingOfType(elementAt.getFirstChild(), PsiJavaCodeReferenceElement.class);
            PsiElement providerClass;
            if (providerClassReference != null && (providerClass = providerClassReference.resolve()) instanceof PsiClass) {
                aClass = (PsiClass) providerClass;
            } else if ((aClass = PsiTreeUtil.getNextSiblingOfType(elementAt.getFirstChild(), PsiAnonymousClass.class)) == null) {
                return Result.create(null, expression);
            }
            cacheDependencies.add(aClass);
            return Result.create(getTypeFromProvider(aClass), cacheDependencies);
        } else if (elementAt != null) {
            PsiType type = ((PsiExpression) elementAt).getType();
            if (type != null && (aClass = JavaPsiFacade.getInstance(expression.getProject()).findClass(type.getCanonicalText(), ProjectScope.getAllScope(expression.getProject()))) != null) {
                return Result.create(getTypeFromProvider(aClass), cacheDependencies);
            }
        }
    }
    return Result.create(null, cacheDependencies);
}
Also used : JSTypeSource(com.intellij.lang.javascript.psi.types.JSTypeSource) JSType(com.intellij.lang.javascript.psi.JSType) PsiExpression(com.intellij.psi.PsiExpression) PsiJavaCodeReferenceElement(com.intellij.psi.PsiJavaCodeReferenceElement) PsiClass(com.intellij.psi.PsiClass) PsiReference(com.intellij.psi.PsiReference) LinkedList(java.util.LinkedList) PsiNewExpression(com.intellij.psi.PsiNewExpression) JSRecordTypeImpl(com.intellij.lang.javascript.psi.types.JSRecordTypeImpl) Project(com.intellij.openapi.project.Project) GlobalSearchScope(com.intellij.psi.search.GlobalSearchScope) PsiReturnStatement(com.intellij.psi.PsiReturnStatement) PsiElement(com.intellij.psi.PsiElement) PsiType(com.intellij.psi.PsiType) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

JSType (com.intellij.lang.javascript.psi.JSType)5 PsiElement (com.intellij.psi.PsiElement)3 PsiClass (com.intellij.psi.PsiClass)2 GlobalSearchScope (com.intellij.psi.search.GlobalSearchScope)2 LinkedList (java.util.LinkedList)2 Nullable (org.jetbrains.annotations.Nullable)2 CompletionContributor (com.intellij.codeInsight.completion.CompletionContributor)1 CompletionParameters (com.intellij.codeInsight.completion.CompletionParameters)1 CompletionResultSet (com.intellij.codeInsight.completion.CompletionResultSet)1 AutoCompletionPolicy (com.intellij.codeInsight.lookup.AutoCompletionPolicy)1 LookupElementBuilder (com.intellij.codeInsight.lookup.LookupElementBuilder)1 LocalQuickFix (com.intellij.codeInspection.LocalQuickFix)1 ASTNode (com.intellij.lang.ASTNode)1 JSTokenTypes (com.intellij.lang.javascript.JSTokenTypes)1 JSExpression (com.intellij.lang.javascript.psi.JSExpression)1 JSField (com.intellij.lang.javascript.psi.JSField)1 JSFunction (com.intellij.lang.javascript.psi.JSFunction)1 JSProperty (com.intellij.lang.javascript.psi.JSProperty)1 JSClass (com.intellij.lang.javascript.psi.ecmal4.JSClass)1 JSSimpleTypeProcessor (com.intellij.lang.javascript.psi.resolve.JSSimpleTypeProcessor)1