IDEA-89690 add information where a method comes from in method code completion popup for groovy

This commit is contained in:
Max Medvedev
2012-10-08 19:49:46 +03:00
parent aee98a17ac
commit 4664f018c2
34 changed files with 318 additions and 203 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl.light;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.lang.Language;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.navigation.ItemPresentation;
@@ -41,7 +42,7 @@ import java.util.List;
/**
* @author peter
*/
public class LightMethodBuilder extends LightElement implements PsiMethod {
public class LightMethodBuilder extends LightElement implements PsiMethod, OriginInfoAwareElement {
private final String myName;
private Computable<PsiType> myReturnType;
private final PsiModifierList myModifierList;
@@ -52,6 +53,7 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
private PsiClass myContainingClass;
private boolean myConstructor;
private String myMethodKind = "LightMethodBuilder";
private String myOriginInfo = null;
public LightMethodBuilder(PsiClass constructedClass, Language language) {
this(constructedClass.getManager(), language, constructedClass.getName());
@@ -435,4 +437,15 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
((LightTypeParameterListBuilder)myTypeParameterList).addParameter(new LightTypeParameter(parameter));
return this;
}
@Nullable
@Override
public String getOriginInfo() {
return myOriginInfo;
}
public void setOriginInfo(@Nullable String originInfo) {
myOriginInfo = originInfo;
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl.light;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.lang.Language;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.util.text.StringUtil;
@@ -25,18 +26,20 @@ import com.intellij.ui.RowIcon;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author ven
*/
public abstract class LightVariableBase extends LightElement implements PsiVariable {
public abstract class LightVariableBase extends LightElement implements PsiVariable, OriginInfoAwareElement {
protected PsiElement myScope;
protected PsiIdentifier myNameIdentifier;
protected PsiType myType;
protected final PsiModifierList myModifierList;
protected boolean myWritable;
private String myOriginInfo = null;
public LightVariableBase(PsiManager manager, PsiIdentifier nameIdentifier, PsiType type, boolean writable, PsiElement scope) {
this(manager, nameIdentifier, JavaLanguage.INSTANCE, type, writable, scope);
@@ -154,4 +157,14 @@ public abstract class LightVariableBase extends LightElement implements PsiVaria
public PsiType getTypeNoResolve() {
return getType();
}
@Nullable
@Override
public String getOriginInfo() {
return myOriginInfo;
}
public void setOriginInfo(String originInfo) {
myOriginInfo = originInfo;
}
}
@@ -1,7 +1,8 @@
package com.intellij.psi.impl.light;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.lang.Language;
import com.intellij.lang.StdLanguages;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.navigation.NavigationItem;
import com.intellij.psi.*;
import com.intellij.psi.impl.ElementPresentationUtil;
@@ -10,24 +11,26 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author peter
*/
public class LightVariableBuilder<T extends LightVariableBuilder> extends LightElement implements PsiVariable, NavigationItem {
public class LightVariableBuilder<T extends LightVariableBuilder> extends LightElement implements PsiVariable, NavigationItem, OriginInfoAwareElement {
private final String myName;
private final PsiType myType;
private volatile LightModifierList myModifierList;
private volatile Icon myBaseIcon = PlatformIcons.VARIABLE_ICON;
private String myOriginInfo;
public LightVariableBuilder(@NotNull String name, @NotNull String type, @NotNull PsiElement navigationElement) {
this(name, JavaPsiFacade.getElementFactory(navigationElement.getProject()).createTypeFromText(type, navigationElement), navigationElement);
}
public LightVariableBuilder(@NotNull String name, @NotNull PsiType type, @NotNull PsiElement navigationElement) {
this(navigationElement.getManager(), name, type, StdLanguages.JAVA);
this(navigationElement.getManager(), name, type, JavaLanguage.INSTANCE);
setNavigationElement(navigationElement);
}
@@ -124,4 +127,14 @@ public class LightVariableBuilder<T extends LightVariableBuilder> extends LightE
myBaseIcon = baseIcon;
return (T)this;
}
@Nullable
@Override
public String getOriginInfo() {
return myOriginInfo;
}
public void setOriginInfo(@Nullable String originInfo) {
myOriginInfo = originInfo;
}
}
@@ -0,0 +1,26 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion.originInfo;
import org.jetbrains.annotations.Nullable;
/**
* @author Max Medvedev
*/
public interface OriginInfoAwareElement {
@Nullable
String getOriginInfo();
}
@@ -0,0 +1,66 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.codeInsight.completion.originInfo;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Provides info for magic method or properties about their origin:
* original class, rule according to which the element was added, etc
*
* @see OriginInfoProvider#provideOriginInfo(com.intellij.psi.PsiElement)
* @see com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement
*
*
* @author Max Medvedev
*/
public abstract class OriginInfoProvider {
private static final ExtensionPointName<OriginInfoProvider> EP_NAME = ExtensionPointName.create("com.intellij.originInfoProvider");
@Nullable
public static String getOriginInfo(@Nullable PsiElement element) {
if (element == null) return null;
String info = _getOriginInfo(element);
if (info != null) info = "(" + info + ")";
return info;
}
@Nullable
private static String _getOriginInfo(@NotNull PsiElement element) {
if (element instanceof OriginInfoAwareElement) {
String info = ((OriginInfoAwareElement)element).getOriginInfo();
if (info != null) return info;
}
for (OriginInfoProvider provider : EP_NAME.getExtensions()) {
String info = provider.provideOriginInfo(element);
if (info != null) return info;
}
return null;
}
/**
* @param element magic element
* @return info to show in completion tail text
*/
@Nullable
protected abstract String provideOriginInfo(@NotNull PsiElement element);
}
@@ -292,6 +292,12 @@ public final class LookupElementBuilder extends LookupElement {
myAllLookupStrings, myCaseSensitive);
}
public LookupElementBuilder appendTailText(@NotNull String tailText, boolean grayed) {
final LookupElementPresentation presentation = copyPresentation();
presentation.appendTailText(tailText, grayed);
return new LookupElementBuilder(myLookupString, myObject, myInsertHandler, null, presentation, myAllLookupStrings, myCaseSensitive);
}
public LookupElement withAutoCompletionPolicy(AutoCompletionPolicy policy) {
return policy.applyPolicy(this);
}
@@ -322,6 +322,7 @@
<extensionPoint name="completion.skip" interface="com.intellij.codeInsight.completion.CompletionPreselectSkipper"/>
<extensionPoint name="lookup.charFilter" interface="com.intellij.codeInsight.lookup.CharFilter"/>
<extensionPoint name="lookup.actionProvider" interface="com.intellij.codeInsight.lookup.LookupActionProvider"/>
<extensionPoint name="originInfoProvider" interface="com.intellij.codeInsight.completion.originInfo.OriginInfoProvider"/>
<extensionPoint name="highlightRangeExtension" interface="com.intellij.codeInsight.daemon.impl.HighlightRangeExtension"/>
+7 -6
View File
@@ -30,7 +30,7 @@
<extensionPoints>
<extensionPoint name="membersContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor"/>
<extensionPoint name="defaultImportContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.DefaultImportContributor"/>
<extensionPoint name="astTransformContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor"/>
<extensionPoint name="astTransformContributor" interface="org.jetbrains.plugins.groovy.lang.resolve.ast.AstTransformContributor"/>
<extensionPoint name="closureMissingMethodContributor"
interface="org.jetbrains.plugins.groovy.lang.resolve.ClosureMissingMethodContributor"/>
<extensionPoint name="variableEnhancer" interface="org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.GrVariableEnhancer"/>
@@ -79,9 +79,8 @@
<membersContributor implementation="org.jetbrains.plugins.groovy.annotator.intentions.dynamic.DynamicMembersContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.noncode.GrCollectionTypeMembersProvider"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.noncode.LoggingContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.spock.SpockMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.MixinMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.noncode.MixinMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.swingBuilder.SwingBuilderNonCodeMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.dgm.DGMMemberContributor"/>
@@ -92,11 +91,14 @@
<membersContributor implementation="org.jetbrains.plugins.groovy.geb.GebJUnitTestMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.geb.GebBrowserMemberContributor"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.gant.GantMemberContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.DelegatedMethodsContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.AutoExternalizeContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.AutoCloneContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.noncode.ConstructorAnnotationsProcessor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.noncode.GrInheritConstructorContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.ConstructorAnnotationsProcessor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.GrInheritConstructorContributor"/>
<astTransformContributor implementation="org.jetbrains.plugins.groovy.lang.resolve.ast.LoggingContributor"/>
<positionManagerDelegate implementation="org.jetbrains.plugins.groovy.gant.GantPositionManagerHelper"/>
@@ -133,7 +135,6 @@
<variableEnhancer implementation="org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.ClosureParameterEnhancer"/>
<variableEnhancer implementation="org.jetbrains.plugins.groovy.lang.psi.typeEnhancers.ClosureAsAnonymousParameterEnhancer"/>
<membersContributor implementation="org.jetbrains.plugins.groovy.gant.GantMemberContributor"/>
<typeConverter implementation="org.jetbrains.plugins.groovy.lang.psi.impl.GrContainerTypeConverter"/>
<typeConverter implementation="org.jetbrains.plugins.groovy.lang.psi.impl.types.GrStringTypeConverter"/>
@@ -95,7 +95,7 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GrStringUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.noncode.GrInheritConstructorContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ast.GrInheritConstructorContributor;
import org.jetbrains.plugins.groovy.lang.resolve.processors.PropertyResolverProcessor;
import org.jetbrains.plugins.groovy.refactoring.GroovyRefactoringUtil;
@@ -77,8 +77,8 @@ import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyConstantExpressionEvaluator;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.MixinMemberContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.noncode.MixinMemberContributor;
import java.util.ArrayList;
import java.util.List;
@@ -30,7 +30,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrGd
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrGdkMethodImpl;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.MixinMemberContributor;
import org.jetbrains.plugins.groovy.lang.resolve.noncode.MixinMemberContributor;
/**
* author ven
@@ -22,6 +22,7 @@ import com.intellij.codeInsight.completion.AllClassesGetter;
import com.intellij.codeInsight.completion.JavaClassNameCompletionContributor;
import com.intellij.codeInsight.completion.JavaCompletionUtil;
import com.intellij.codeInsight.completion.PrefixMatcher;
import com.intellij.codeInsight.completion.originInfo.OriginInfoProvider;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.lookup.LookupItem;
@@ -356,6 +357,12 @@ public class GroovyCompletionUtil {
}
builder = builder.withTailText(tailText, true);
}
String originInfo = OriginInfoProvider.getOriginInfo(element);
if (originInfo != null) {
builder = builder.appendTailText(originInfo, true);
}
return builder;
}
@@ -43,7 +43,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefini
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.GrStubElementBase;
import org.jetbrains.plugins.groovy.lang.psi.stubs.GrModifierListStub;
import org.jetbrains.plugins.groovy.lang.resolve.noncode.ConstructorAnnotationsProcessor;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
/**
* @autor: Dmitry.Krasilschikov
@@ -164,7 +164,7 @@ public class GrModifierListImpl extends GrStubElementBase<GrModifierListStub> im
}
if (pParent instanceof GrTypeDefinition) {
PsiModifierList pModifierList = ((GrTypeDefinition)pParent).getModifierList();
if (pModifierList != null && pModifierList.findAnnotation(ConstructorAnnotationsProcessor.IMMUTABLE) != null) {
if (pModifierList != null && pModifierList.findAnnotation(GroovyCommonClassNames.GROOVY_LANG_IMMUTABLE) != null) {
if (modifier.equals(GrModifier.FINAL)) return true;
}
}
@@ -73,7 +73,7 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.stubs.GrTypeDefinitionStub;
import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ast.AstTransformContributor;
import org.jetbrains.plugins.groovy.runner.GroovyRunnerUtil;
import org.jetbrains.plugins.groovy.util.LightCacheKey;
@@ -78,6 +78,7 @@ public class GrAccessorMethodImpl extends LightMethodBuilder implements GrAccess
setContainingClass(myProperty.getContainingClass());
setMethodKind("AccessorMethod");
setOriginInfo("synthetic accessor for '"+myProperty.getName()+"'");
}
@Nullable
@@ -124,7 +125,6 @@ public class GrAccessorMethodImpl extends LightMethodBuilder implements GrAccess
public static GrAccessorMethod createSetterMethod(GrField field) {
if (field.isProperty() && !field.hasModifierProperty(PsiModifier.FINAL)) {
String fieldName = field.getName();
assert fieldName != null;
String name = GroovyPropertyUtils.getSetterName(fieldName);
final GrAccessorMethod setter = new GrAccessorMethodImpl(field, true, name);
@@ -140,7 +140,6 @@ public class GrAccessorMethodImpl extends LightMethodBuilder implements GrAccess
public static GrAccessorMethod[] createGetterMethods(GrField field) {
if (field.isProperty()) {
String fieldName = field.getName();
assert fieldName != null;
final PsiClass clazz = field.getContainingClass();
GrAccessorMethod getter1 = new GrAccessorMethodImpl(field, false, GroovyPropertyUtils.getGetterNameNonBoolean(fieldName));
@@ -15,6 +15,7 @@
*/
package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
@@ -56,7 +57,7 @@ import java.util.List;
* User: Dmitry.Krasilschikov
* Date: 21.02.2008
*/
public class GrDynamicImplicitMethod extends LightElement implements PsiMethod, GrDynamicImplicitElement {
public class GrDynamicImplicitMethod extends LightElement implements PsiMethod, GrDynamicImplicitElement, OriginInfoAwareElement {
private final PsiManager myManager;
private final GrMethod myMethod;
@@ -72,6 +73,12 @@ public class GrDynamicImplicitMethod extends LightElement implements PsiMethod,
myContainingClassName = containingClassName;
}
@Nullable
@Override
public String getOriginInfo() {
return "dynamic method";
}
public String[] getParameterTypes() {
final PsiParameter[] psiParameters = getParameterList().getParameters();
List<String> result = new ArrayList<String>();
@@ -60,6 +60,8 @@ public class GrDynamicImplicitProperty extends GrImplicitVariableImpl implements
else {
myNavigationalElement = navigationalElement;
}
setOriginInfo("dynamic property");
}
@Nullable
@@ -24,6 +24,7 @@ import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import icons.JetgroovyIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrGdkMethod;
@@ -37,7 +38,7 @@ public class GrGdkMethodImpl extends LightMethodBuilder implements GrGdkMethod {
private static Key<CachedValue<GrGdkMethodImpl>> CACHED_NON_STATIC = Key.create("Cached instance gdk method");
private final PsiMethod myMethod;
private GrGdkMethodImpl(PsiMethod method, boolean isStatic) {
private GrGdkMethodImpl(PsiMethod method, boolean isStatic, String originInfo) {
super(method.getManager(), GroovyFileType.GROOVY_LANGUAGE, method.getName());
myMethod = method;
@@ -55,6 +56,16 @@ public class GrGdkMethodImpl extends LightMethodBuilder implements GrGdkMethod {
setBaseIcon(JetgroovyIcons.Groovy.Method);
setMethodKind("GrGdkMethod");
setNavigationElement(method);
if (originInfo != null) {
setOriginInfo(originInfo);
}
else {
PsiClass aClass = method.getContainingClass();
if (aClass != null && aClass.getName() != null) {
setOriginInfo(aClass.getName());
}
}
}
@NotNull
@@ -95,13 +106,18 @@ public class GrGdkMethodImpl extends LightMethodBuilder implements GrGdkMethod {
@NotNull
public static GrGdkMethod createGdkMethod(@NotNull final PsiMethod original, final boolean isStatic) {
return createGdkMethod(original, isStatic, null);
}
@NotNull
public static GrGdkMethod createGdkMethod(@NotNull final PsiMethod original, final boolean isStatic, @Nullable final String originInfo) {
final Key<CachedValue<GrGdkMethodImpl>> cachedValueKey = isStatic ? CACHED_STATIC : CACHED_NON_STATIC;
CachedValue<GrGdkMethodImpl> cachedValue = original.getUserData(cachedValueKey);
if (cachedValue == null) {
cachedValue = CachedValuesManager.getManager(original.getProject()).createCachedValue(new CachedValueProvider<GrGdkMethodImpl>() {
@Override
public Result<GrGdkMethodImpl> compute() {
return Result.create(new GrGdkMethodImpl(original, isStatic), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
return Result.create(new GrGdkMethodImpl(original, isStatic, originInfo), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
}
});
original.putUserData(cachedValueKey, cachedValue);
@@ -15,6 +15,7 @@
*/
package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.navigation.ItemPresentation;
import com.intellij.psi.*;
import com.intellij.psi.impl.ElementPresentationUtil;
@@ -54,7 +55,7 @@ import java.util.Map;
/**
* @author Sergey Evdokimov
*/
public class GrLightMethodBuilder extends LightElement implements GrMethod {
public class GrLightMethodBuilder extends LightElement implements GrMethod, OriginInfoAwareElement {
protected String myName;
private PsiType myReturnType = PsiType.VOID;
private final GrLightModifierList myModifierList;
@@ -67,6 +68,7 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod {
private Object myData;
private boolean myConstructor;
private String myOriginInfo;
public GrLightMethodBuilder(PsiManager manager, String name) {
super(manager, GroovyFileType.GROOVY_LANGUAGE);
@@ -462,4 +464,13 @@ public class GrLightMethodBuilder extends LightElement implements GrMethod {
return this;
}
@Nullable
@Override
public String getOriginInfo() {
return myOriginInfo;
}
public void setOriginInfo(@Nullable String originInfo) {
myOriginInfo = originInfo;
}
}
@@ -65,7 +65,7 @@ public class GrLightModifierList extends LightElement implements GrModifierList
myModifiers = modifiers;
}
public void setModifiers(String[] modifiers) {
public void setModifiers(String... modifiers) {
myModifiers = 0;
for (String modifier : modifiers) {
@@ -1,108 +0,0 @@
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*//*
package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightVariableBase;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrAssignmentExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement;
*/
/**
* @author Max Medvedev
*//*
public class GrUndefinedVariable extends LightVariableBase implements GrVariable {
public GrUndefinedVariable(GrAssignmentExpression assignment) {
super(assignment.getManager(), new GrImplicitVariableImpl.GrLightIdentifier(assignment.getManager(), assignment.getLValue().getText()),
PsiType.getJavaLangObject(assignment.getManager(), assignment.getResolveScope()), true, assignment.get);
}
@Nullable
@Override
public GrExpression getInitializerGroovy() {
//todo
return null;
}
@Override
public void setType(@Nullable PsiType type) throws IncorrectOperationException {
//todo
}
@Nullable
@Override
public GrTypeElement getTypeElementGroovy() {
//todo
return null;
}
@Nullable
@Override
public PsiType getTypeGroovy() {
//todo
return null;
}
@Nullable
@Override
public PsiType getDeclaredType() {
//todo
return null;
}
@Nullable
@Override
public GrModifierList getModifierList() {
//todo
return null;
}
@NotNull
@Override
public PsiElement getNameIdentifierGroovy() {
//todo
return null;
}
@Override
public void accept(GroovyElementVisitor visitor) {
//todo
}
@Override
public void acceptChildren(GroovyElementVisitor visitor) {
//todo
}
@Override
public String toString() {
//todo
return null;
}
}
*/
@@ -55,6 +55,8 @@ public final class GroovyCommonClassNames {
@NonNls public static final String GROOVY_TRANSFORM_TYPE_CHECKED = "groovy.transform.TypeChecked";
@NonNls public static final String GROOVY_TRANSFORM_TYPE_CHECKING_MODE = "groovy.transform.TypeCheckingMode";
@NonNls public static final String JAVA_LANG_CHAR_SEQUENCE = "java.lang.CharSequence";
public static final String GROOVY_TRANSFORM_INHERIT_CONSTRUCTORS = "groovy.transform.InheritConstructors";
public static final String GROOVY_LANG_IMMUTABLE = "groovy.lang.Immutable";
private GroovyCommonClassNames() {
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.lang.resolve;
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.util.Computable;
@@ -23,7 +23,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author Max Medvedev
@@ -22,7 +22,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import java.util.Collection;
@@ -35,9 +34,11 @@ public class AutoCloneContributor extends AstTransformContributor {
public void collectMethods(@NotNull GrTypeDefinition clazz, Collection<PsiMethod> collector) {
if (PsiImplUtil.getAnnotation(clazz, GroovyCommonClassNames.GROOVY_TRANSFORM_AUTO_CLONE) == null) return;
final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone").addModifier(PsiModifier.PUBLIC);
final LightMethodBuilder clone = new LightMethodBuilder(clazz.getManager(), "clone");
clone.addModifier(PsiModifier.PUBLIC);
clone.setContainingClass(clazz);
clone.addException(CloneNotSupportedException.class.getName());
clone.setOriginInfo("created by @AutoClone");
collector.add(clone);
}
}
@@ -24,7 +24,6 @@ import org.jetbrains.plugins.groovy.gpp.GppTypeConverter;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import java.io.IOException;
import java.io.ObjectInput;
@@ -44,11 +43,13 @@ public class AutoExternalizeContributor extends AstTransformContributor {
write.setContainingClass(clazz);
write.addParameter("out", ObjectOutput.class.getName());
write.addException(IOException.class.getName());
write.setOriginInfo("created by @AutoExternalize");
collector.add(write);
final LightMethodBuilder read = new LightMethodBuilder(clazz.getManager(), "readExternal");
read.setContainingClass(clazz);
read.addParameter("oin", ObjectInput.class.getName());
read.setOriginInfo("created by @AutoExternalize");
collector.add(read);
}
@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.lang.resolve.noncode;
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -24,20 +24,21 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightParameter;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import org.jetbrains.plugins.groovy.lang.resolve.CollectClassMembersUtil;
import java.util.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames.*;
/**
* @author peter
*/
public class ConstructorAnnotationsProcessor extends AstTransformContributor {
public static final String IMMUTABLE = "groovy.lang.Immutable";
@Override
public void collectMethods(@NotNull GrTypeDefinition typeDefinition, Collection<PsiMethod> collector) {
if (typeDefinition.getName() == null) return;
@@ -45,10 +46,10 @@ public class ConstructorAnnotationsProcessor extends AstTransformContributor {
PsiModifierList modifierList = typeDefinition.getModifierList();
if (modifierList == null) return;
final PsiAnnotation tupleConstructor = modifierList.findAnnotation(GroovyCommonClassNames.GROOVY_TRANSFORM_TUPLE_CONSTRUCTOR);
final boolean immutable = modifierList.findAnnotation(IMMUTABLE) != null ||
modifierList.findAnnotation(GroovyCommonClassNames.GROOVY_TRANSFORM_IMMUTABLE) != null;
final PsiAnnotation canonical = modifierList.findAnnotation(GroovyCommonClassNames.GROOVY_TRANSFORM_CANONICAL);
final PsiAnnotation tupleConstructor = modifierList.findAnnotation(GROOVY_TRANSFORM_TUPLE_CONSTRUCTOR);
final boolean immutable = modifierList.findAnnotation(GROOVY_LANG_IMMUTABLE) != null ||
modifierList.findAnnotation(GROOVY_TRANSFORM_IMMUTABLE) != null;
final PsiAnnotation canonical = modifierList.findAnnotation(GROOVY_TRANSFORM_CANONICAL);
if (!immutable && canonical == null && tupleConstructor == null) {
return;
}
@@ -86,6 +87,15 @@ public class ConstructorAnnotationsProcessor extends AstTransformContributor {
tupleConstructor != null ? PsiUtil.getAnnoAttributeValue(tupleConstructor, "includeFields", false) : canonical == null,
!immutable, excludes);
if (immutable) {
fieldsConstructor.setOriginInfo("created by @Immutable");
}
else if (tupleConstructor != null) {
fieldsConstructor.setOriginInfo("created by @TupleConstructor");
}
else /*if (canonical != null)*/ {
fieldsConstructor.setOriginInfo("created by @Canonical");
}
collector.add(fieldsConstructor.setContainingClass(typeDefinition));
@@ -97,7 +107,7 @@ public class ConstructorAnnotationsProcessor extends AstTransformContributor {
boolean superFields,
boolean superProperties, Set<PsiClass> visited, Set<String> excludes) {
PsiClass parent = typeDefinition.getSuperClass();
if (parent != null && visited.add(parent) && !GroovyCommonClassNames.GROOVY_OBJECT_SUPPORT.equals(parent.getQualifiedName())) {
if (parent != null && visited.add(parent) && !GROOVY_OBJECT_SUPPORT.equals(parent.getQualifiedName())) {
addParametersForSuper(parent, fieldsConstructor, superFields, superProperties, visited, excludes);
addParameters(parent, fieldsConstructor, superProperties, superFields, true, excludes);
}
@@ -13,19 +13,23 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.impl.light;
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.codeInsight.completion.originInfo.OriginInfoAwareElement;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiMirrorElement;
import com.intellij.psi.impl.light.LightMethod;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Max Medvedev
*/
public class LightMirrorMethod extends LightMethod implements PsiMethod, PsiMirrorElement {
public class DelegatedMethod extends LightMethod implements PsiMethod, PsiMirrorElement, OriginInfoAwareElement {
private PsiMethod myPrototype;
public LightMirrorMethod(@NotNull PsiMethod delegate, @NotNull PsiMethod prototype) {
public DelegatedMethod(@NotNull PsiMethod delegate, @NotNull PsiMethod prototype) {
super(prototype.getManager(), delegate, delegate.getContainingClass());
myPrototype = prototype;
}
@@ -35,4 +39,14 @@ public class LightMirrorMethod extends LightMethod implements PsiMethod, PsiMirr
public PsiMethod getPrototype() {
return myPrototype;
}
@Nullable
@Override
public String getOriginInfo() {
PsiClass aClass = myPrototype.getContainingClass();
if (aClass != null & aClass.getName() != null) {
return "delegated from " + aClass.getName();
}
return null;
}
}
@@ -18,7 +18,6 @@ package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.psi.impl.light.LightMirrorMethod;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiUtil;
@@ -38,7 +37,6 @@ import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GrClassImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import java.util.*;
@@ -300,6 +298,6 @@ public class DelegatedMethodsContributor extends AstTransformContributor {
}
builder.setBaseIcon(JetgroovyIcons.Groovy.Method);
return new LightMirrorMethod(builder, method);
return new DelegatedMethod(builder, method);
}
}
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.lang.resolve.noncode;
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -21,7 +21,7 @@ import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightMethodBuilder;
import org.jetbrains.plugins.groovy.lang.resolve.AstTransformContributor;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import java.util.Collection;
@@ -29,7 +29,6 @@ import java.util.Collection;
* @author Maxim.Medvedev
*/
public class GrInheritConstructorContributor extends AstTransformContributor {
public static final String INHERIT_CONSTRUCTOR_NAME = "groovy.transform.InheritConstructors";
@Override
public void collectMethods(@NotNull GrTypeDefinition psiClass, Collection<PsiMethod> collector) {
@@ -44,12 +43,16 @@ public class GrInheritConstructorContributor extends AstTransformContributor {
final PsiSubstitutor superClassSubstitutor = TypeConversionUtil.getSuperClassSubstitutor(superClass, psiClass, PsiSubstitutor.EMPTY);
for (PsiMethod constructor : superClass.getConstructors()) {
final GrLightMethodBuilder inheritedConstructor =
new GrLightMethodBuilder(psiClass.getManager(), psiClass.getName()).setContainingClass(psiClass);
inheritedConstructor.setConstructor(true).setNavigationElement(psiClass);
final GrLightMethodBuilder inheritedConstructor = new GrLightMethodBuilder(psiClass.getManager(), psiClass.getName());
inheritedConstructor.setContainingClass(psiClass);
inheritedConstructor.setConstructor(true);
inheritedConstructor.setNavigationElement(psiClass);
inheritedConstructor.setOriginInfo("created by @InheritConstructors");
for (PsiParameter parameter : constructor.getParameterList().getParameters()) {
inheritedConstructor
.addParameter(StringUtil.notNullize(parameter.getName()), superClassSubstitutor.substitute(parameter.getType()), false);
String name = StringUtil.notNullize(parameter.getName());
PsiType type = superClassSubstitutor.substitute(parameter.getType());
inheritedConstructor.addParameter(name, type, false);
}
if (psiClass.findCodeMethodsBySignature(inheritedConstructor, false).length == 0) {
collector.add(inheritedConstructor);
@@ -59,6 +62,6 @@ public class GrInheritConstructorContributor extends AstTransformContributor {
public static boolean hasInheritConstructorsAnnotation(PsiClass psiClass) {
final PsiModifierList modifierList = psiClass.getModifierList();
return modifierList != null && modifierList.findAnnotation(INHERIT_CONSTRUCTOR_NAME) != null;
return modifierList != null && modifierList.findAnnotation(GroovyCommonClassNames.GROOVY_TRANSFORM_INHERIT_CONSTRUCTORS) != null;
}
}
@@ -13,24 +13,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.lang.resolve.noncode;
package org.jetbrains.plugins.groovy.lang.resolve.ast;
import com.google.common.collect.ImmutableMap;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightFieldBuilder;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.PsiModifier;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifierList;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.annotation.GrAnnotation;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrLightField;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import java.util.Collection;
/**
* @author peter
*/
public class LoggingContributor extends NonCodeMembersContributor {
public class LoggingContributor extends AstTransformContributor {
private static final ImmutableMap<String, String> ourLoggers = ImmutableMap.<String, String>builder().
put("groovy.util.logging.Log", "java.util.logging.Logger").
put("groovy.util.logging.Commons", "org.apache.commons.logging.Log").
@@ -39,23 +39,20 @@ public class LoggingContributor extends NonCodeMembersContributor {
build();
@Override
public void processDynamicElements(@NotNull PsiType qualifierType,
PsiClass psiClass,
PsiScopeProcessor processor,
GroovyPsiElement place,
ResolveState state) {
if (!(psiClass instanceof GrTypeDefinition) || !PsiTreeUtil.isAncestor(psiClass, place, true)) return;
PsiModifierList modifierList = psiClass.getModifierList();
public void collectFields(@NotNull GrTypeDefinition psiClass, Collection<GrField> collector) {
GrModifierList modifierList = psiClass.getModifierList();
if (modifierList == null) return;
for (PsiAnnotation annotation : modifierList.getAnnotations()) {
for (GrAnnotation annotation : modifierList.getAnnotations()) {
String qname = annotation.getQualifiedName();
String logger = ourLoggers.get(qname);
if (logger != null) {
String fieldName = PsiUtil.getAnnoAttributeValue(annotation, "value", "log");
LightFieldBuilder field = new LightFieldBuilder(fieldName, logger, annotation).setContainingClass(psiClass)
.setModifiers(PsiModifier.FINAL, PsiModifier.STATIC, PsiModifier.PRIVATE);
ResolveUtil.processElement(processor, field, state);
GrLightField field = new GrLightField(psiClass, fieldName, logger);
field.setNavigationElement(annotation);
field.getModifierList().setModifiers(PsiModifier.PRIVATE, PsiModifier.FINAL, PsiModifier.STATIC);
field.setOriginInfo("created by @" + annotation.getShortName());
collector.add(field);
}
}
}
@@ -29,6 +29,8 @@ import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint;
import static com.intellij.psi.CommonClassNames.JAVA_UTIL_COLLECTION;
/**
* @author Maxim.Medvedev
*/
@@ -36,7 +38,7 @@ public class GrCollectionTypeMembersProvider extends NonCodeMembersContributor {
@Override
public String getParentClassName() {
return CommonClassNames.JAVA_UTIL_COLLECTION;
return JAVA_UTIL_COLLECTION;
}
@Override
@@ -48,31 +50,28 @@ public class GrCollectionTypeMembersProvider extends NonCodeMembersContributor {
final PsiType collectionType = PsiUtil.extractIterableTypeParameter(qualifierType, true);
if (collectionType == null) return;
final PsiScopeProcessor fieldSearcher = new FieldSearcher(processor, JavaPsiFacade.getInstance(place.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTION, place.getResolveScope()));
PsiClass collectionClass = JavaPsiFacade.getInstance(place.getProject()).findClass(JAVA_UTIL_COLLECTION, place.getResolveScope());
final PsiScopeProcessor fieldSearcher = new FieldSearcher(processor, collectionClass);
ResolveUtil.processAllDeclarations(collectionType, fieldSearcher, state, place);
}
private static class FieldSearcher extends DelegatingScopeProcessor implements ClassHint, ElementClassHint {
final PsiClass collectionClass;
final PsiClass myCollectionClass;
public FieldSearcher(PsiScopeProcessor processor, PsiClass collectionClass) {
super(processor);
this.collectionClass = collectionClass;
myCollectionClass = collectionClass;
}
@Override
public boolean execute(@NotNull PsiElement element, ResolveState state) {
if (element instanceof PsiField) {
final PsiType type = ((PsiField)element).getType();
final String typeText;
if (type instanceof PsiClassType) {
typeText = CommonClassNames.JAVA_UTIL_COLLECTION + "<" + type.getCanonicalText() + ">";
}
else {
typeText = CommonClassNames.JAVA_UTIL_COLLECTION;
}
LightFieldBuilder lightField = new LightFieldBuilder(((PsiField)element).getName(), typeText, element).setContainingClass(
collectionClass);
final String typeText =
type instanceof PsiClassType ? JAVA_UTIL_COLLECTION + "<" + type.getCanonicalText() + ">" : JAVA_UTIL_COLLECTION;
LightFieldBuilder lightField = new LightFieldBuilder(((PsiField)element).getName(), typeText, element);
lightField.setContainingClass(myCollectionClass);
lightField.setOriginInfo("spread collection field");
return super.execute(lightField, state);
}
return true;
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.plugins.groovy.lang.resolve;
package org.jetbrains.plugins.groovy.lang.resolve.noncode;
import com.intellij.psi.*;
import com.intellij.psi.scope.DelegatingScopeProcessor;
@@ -29,6 +29,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrRefere
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrGdkMethodImpl;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyCommonClassNames;
import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
import java.util.ArrayList;
import java.util.List;
@@ -71,7 +72,9 @@ public class MixinMemberContributor extends NonCodeMembersContributor {
@Override
public boolean execute(@NotNull PsiElement element, ResolveState state) {
if (isCategoryMethod(element, qualifierType, state.get(PsiSubstitutor.KEY))) {
return super.execute(GrGdkMethodImpl.createGdkMethod((PsiMethod)element, false), state);
PsiMethod method = (PsiMethod)element;
String originInfo = getOriginInfo(method);
return super.execute(GrGdkMethodImpl.createGdkMethod(method, false, originInfo), state);
}
else {
return super.execute(element, state);
@@ -83,6 +86,14 @@ public class MixinMemberContributor extends NonCodeMembersContributor {
}
}
private static String getOriginInfo(PsiMethod element) {
PsiClass aClass = element.getContainingClass();
if (aClass != null && aClass.getName() != null) {
return "mixed in from " + aClass.getName();
}
return "mixed in";
}
private static List<PsiAnnotation> getAllMixins(PsiModifierList modifierList) {
final ArrayList<PsiAnnotation> result = new ArrayList<PsiAnnotation>();
for (PsiAnnotation annotation : modifierList.getApplicableAnnotations()) {
@@ -20,7 +20,6 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.intellij.psi.impl.light.LightMirrorMethod;
import com.intellij.psi.util.MethodSignature;
import com.intellij.psi.util.MethodSignatureBackedByPsiMethod;
import com.intellij.psi.util.PsiUtil;
@@ -42,6 +41,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeElement;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions.TypesUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyConstantExpressionEvaluator;
import org.jetbrains.plugins.groovy.lang.resolve.ast.DelegatedMethod;
import java.util.*;
@@ -288,8 +288,8 @@ public class StubGenerator implements ClassItemGenerator {
public Collection<PsiMethod> collectMethods(PsiClass typeDefinition, boolean classDef) {
List<PsiMethod> methods = new ArrayList<PsiMethod>();
for (PsiMethod method : typeDefinition.getMethods()) {
if (method instanceof LightMirrorMethod) {
PsiMethod prototype = ((LightMirrorMethod)method).getPrototype();
if (method instanceof DelegatedMethod) {
PsiMethod prototype = ((DelegatedMethod)method).getPrototype();
PsiClass aClass = prototype.getContainingClass();
if (prototype.hasModifierProperty(PsiModifier.FINAL) && aClass != null && typeDefinition.isInheritor(aClass, true)) {
continue; //skip final super methods
@@ -35,7 +35,9 @@ import org.jetbrains.plugins.groovy.lang.resolve.NonCodeMembersContributor;
import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint;
import java.util.*;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* @author Sergey Evdokimov
@@ -70,6 +72,7 @@ public class SwingBuilderNonCodeMemberContributor extends NonCodeMembersContribu
public MyMethodBuilder(PsiManager manager, String name) {
super(manager, name);
setMethodKind(METHOD_KIND);
setOriginInfo("SwingBuilder method");
}
@NotNull