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;
}
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();
}
}
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);
}
}
}
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);
}
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);
}
Aggregations