use of org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint in project intellij-community by JetBrains.
the class GrInplaceVariableIntroducer method addAdditionalVariables.
@Override
protected void addAdditionalVariables(TemplateBuilderImpl builder) {
GrVariable variable = getVariable();
assert variable != null && variable.getInitializerGroovy() != null;
final PsiType initializerType = variable.getInitializerGroovy().getType();
TypeConstraint[] constraints = initializerType != null && !initializerType.equals(PsiType.NULL) ? new SupertypeConstraint[] { SupertypeConstraint.create(initializerType) } : TypeConstraint.EMPTY_ARRAY;
ChooseTypeExpression typeExpression = new ChooseTypeExpression(constraints, variable.getManager(), variable.getResolveScope(), true, GroovyApplicationSettings.getInstance().INTRODUCE_LOCAL_SELECT_DEF);
PsiElement element = getTypeELementOrDef(variable);
if (element == null)
return;
builder.replaceElement(element, "Variable_type", typeExpression, true, true);
}
use of org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint in project intellij-community by JetBrains.
the class ClosureCompleter method runTemplate.
public static void runTemplate(List<ClosureParameterInfo> parameters, GrClosableBlock block, PsiSubstitutor substitutor, PsiMethod method, final Project project, final Editor editor) {
if (method instanceof ClsMethodImpl)
method = ((ClsMethodImpl) method).getSourceMirrorMethod();
assert block.getArrow() == null;
if (parameters.isEmpty())
return;
StringBuilder buffer = new StringBuilder();
buffer.append("{");
List<PsiType> paramTypes = ContainerUtil.newArrayList();
for (ClosureParameterInfo parameter : parameters) {
final String type = parameter.getType();
final String name = parameter.getName();
if (type != null) {
final PsiType fromText = JavaPsiFacade.getElementFactory(project).createTypeFromText(type, method);
final PsiType substituted = substitutor.substitute(fromText);
paramTypes.add(substituted);
buffer.append(substituted.getCanonicalText()).append(" ");
} else {
buffer.append("def ");
}
buffer.append(name);
buffer.append(", ");
}
buffer.replace(buffer.length() - 2, buffer.length(), " ->}");
final Document document = editor.getDocument();
final PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(document);
assert file != null;
final GrClosableBlock closure = GroovyPsiElementFactory.getInstance(project).createClosureFromText(buffer.toString());
final GrClosableBlock templateClosure = (GrClosableBlock) block.replaceWithExpression(closure, false);
final TemplateBuilderImpl builder = new TemplateBuilderImpl(templateClosure);
int i = 0;
for (GrParameter p : templateClosure.getParameters()) {
final GrTypeElement typeElement = p.getTypeElementGroovy();
final PsiElement nameIdentifier = p.getNameIdentifierGroovy();
if (typeElement != null) {
final TypeConstraint[] typeConstraints = { SupertypeConstraint.create(paramTypes.get(i++)) };
final ChooseTypeExpression expression = new ChooseTypeExpression(typeConstraints, PsiManager.getInstance(project), nameIdentifier.getResolveScope());
builder.replaceElement(typeElement, expression);
} else {
final ChooseTypeExpression expression = new ChooseTypeExpression(TypeConstraint.EMPTY_ARRAY, PsiManager.getInstance(project), nameIdentifier.getResolveScope());
builder.replaceElement(p.getModifierList(), expression);
}
builder.replaceElement(nameIdentifier, new ParameterNameExpression(nameIdentifier.getText()));
}
final GrClosableBlock afterPostprocess = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(templateClosure);
final Template template = builder.buildTemplate();
TextRange range = afterPostprocess.getTextRange();
document.deleteString(range.getStartOffset(), range.getEndOffset());
TemplateEditingListener templateListener = new TemplateEditingAdapter() {
@Override
public void templateFinished(Template template, boolean brokenOff) {
ApplicationManager.getApplication().runWriteAction(() -> {
PsiDocumentManager.getInstance(project).commitDocument(document);
final CaretModel caretModel = editor.getCaretModel();
final int offset = caretModel.getOffset();
GrClosableBlock block1 = PsiTreeUtil.findElementOfClassAtOffset(file, offset - 1, GrClosableBlock.class, false);
if (block1 != null) {
final PsiElement arrow = block1.getArrow();
if (arrow != null) {
caretModel.moveToOffset(arrow.getTextRange().getEndOffset());
}
// fix space before closure lbrace
final TextRange range1 = block1.getTextRange();
CodeStyleManager.getInstance(project).reformatRange(block1.getParent(), range1.getStartOffset() - 1, range1.getEndOffset(), true);
}
});
}
};
TemplateManager manager = TemplateManager.getInstance(project);
manager.startTemplate(editor, template, templateListener);
}
use of org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint in project intellij-community by JetBrains.
the class CreateMethodFromUsageFix method setupParams.
@NotNull
private ChooseTypeExpression[] setupParams(@NotNull PsiMethod method, @NotNull PsiType[] argTypes, @NotNull JVMElementFactory factory) {
final PsiParameterList parameterList = method.getParameterList();
ChooseTypeExpression[] paramTypesExpressions = new ChooseTypeExpression[argTypes.length];
for (int i = 0; i < argTypes.length; i++) {
PsiType argType = TypesUtil.unboxPrimitiveTypeWrapper(argTypes[i]);
if (argType == null || argType == PsiType.NULL)
argType = TypesUtil.getJavaLangObject(getRefExpr());
final PsiParameter p = factory.createParameter("o", argType);
parameterList.add(p);
TypeConstraint[] constraints = { SupertypeConstraint.create(argType) };
boolean isGroovy = method.getLanguage() == GroovyLanguage.INSTANCE;
paramTypesExpressions[i] = new ChooseTypeExpression(constraints, method.getManager(), method.getResolveScope(), isGroovy);
}
return paramTypesExpressions;
}
use of org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint in project intellij-community by JetBrains.
the class CreateMethodFromUsageFix method invokeImpl.
@Override
protected void invokeImpl(Project project, @NotNull PsiClass targetClass) {
final JVMElementFactory factory = JVMElementFactories.getFactory(targetClass.getLanguage(), targetClass.getProject());
assert factory != null;
PsiMethod method = factory.createMethod(getMethodName(), PsiType.VOID);
final GrReferenceExpression ref = getRefExpr();
if (GrStaticChecker.isInStaticContext(ref, targetClass)) {
method.getModifierList().setModifierProperty(PsiModifier.STATIC, true);
}
PsiType[] argTypes = getArgumentTypes();
assert argTypes != null;
ChooseTypeExpression[] paramTypesExpressions = setupParams(method, argTypes, factory);
TypeConstraint[] constraints = getReturnTypeConstraints();
final PsiGenerationInfo<PsiMethod> info = OverrideImplementUtil.createGenerationInfo(method);
info.insert(targetClass, findInsertionAnchor(info, targetClass), false);
method = info.getPsiMember();
if (shouldBeAbstract(targetClass)) {
method.getBody().delete();
if (!targetClass.isInterface()) {
method.getModifierList().setModifierProperty(PsiModifier.ABSTRACT, true);
}
}
final PsiElement context = PsiTreeUtil.getParentOfType(ref, PsiClass.class, PsiMethod.class, PsiFile.class);
IntentionUtils.createTemplateForMethod(argTypes, paramTypesExpressions, method, targetClass, constraints, false, context);
}
use of org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint in project intellij-community by JetBrains.
the class GroovySmartCompletionContributor method addExpectedClassMembers.
static void addExpectedClassMembers(CompletionParameters params, final CompletionResultSet result) {
for (final TypeConstraint info : getExpectedTypeInfos(params)) {
Consumer<LookupElement> consumer = element -> result.addElement(element);
PsiType type = info.getType();
PsiType defType = info.getDefaultType();
boolean searchInheritors = params.getInvocationCount() > 1;
if (type instanceof PsiClassType) {
new GroovyMembersGetter((PsiClassType) type, params).processMembers(searchInheritors, consumer);
}
if (!defType.equals(type) && defType instanceof PsiClassType) {
new GroovyMembersGetter((PsiClassType) defType, params).processMembers(searchInheritors, consumer);
}
}
}
Aggregations