*/
package org.jetbrains.plugins.groovy.annotator.intentions.dynamic.elements;
+import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
-import com.intellij.psi.PsiVariable;
import com.intellij.psi.PsiModifier;
-import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiVariable;
import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.groovy.annotator.intentions.dynamic.DynamicManager;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrDynamicImplicitProperty;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.LightModifierList;
-import org.jetbrains.plugins.groovy.annotator.intentions.dynamic.DynamicManager;
-import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
if (isStatic != null && isStatic.booleanValue()) {
hashSet.add(PsiModifier.STATIC);
}
- myPsi = new GrDynamicImplicitProperty(manager, getName(), getType(), containingClassName, new LightModifierList(manager, hashSet)) {
+ myPsi = new GrDynamicImplicitProperty(manager, getName(), getType(), containingClassName, new LightModifierList(manager, hashSet), null) {
@Override
public PsiElement setName(@NotNull String name) throws IncorrectOperationException {
DynamicManager.getInstance(getProject()).replaceDynamicPropertyName(containingClassName, getName(), name);
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor;
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElementFactory;
+import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentLabel;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrAnonymousClassDefinition;
import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
+import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
+import org.jetbrains.plugins.groovy.lang.resolve.processors.PropertyResolverProcessor;
/**
* @author ilyas
if (clazz != null) {
PsiMethod[] byName = clazz.findMethodsByName(setterName, true);
if (byName.length > 0) return byName[0];
- return clazz.findFieldByName(propName, true);
+ final PsiField field = clazz.findFieldByName(propName, true);
+ if (field != null) return field;
+ final PropertyResolverProcessor processor = new PropertyResolverProcessor(propName, this);
+ ResolveUtil
+ .processNonCodeMethods(JavaPsiFacade.getElementFactory(getProject()).createType(clazz), processor, getProject(), this, false);
+ final GroovyResolveResult[] candidates = processor.getCandidates();
+ if (candidates.length == 0) return null;
+ return candidates[0].getElement();
}
}
}
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.ProjectScope;
import com.intellij.psi.search.SearchScope;
-import com.intellij.util.ui.tree.TreeUtil;
import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns;
import com.intellij.ui.treeStructure.treetable.TreeTable;
+import com.intellij.util.ui.tree.TreeUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class GrDynamicImplicitProperty extends GrImplicitVariableImpl implements GrDynamicImplicitElement, PsiField {
private final String myContainingClassName;
private final Project myProject;
+ private final PsiElement myNavigationalElement;
- public GrDynamicImplicitProperty(PsiManager manager, @NonNls String name, @NonNls String type, String containingClassName, LightModifierList modifierList) {
- super(modifierList, manager, name, type, null);
+ public GrDynamicImplicitProperty(PsiManager manager, @NonNls String name, @NonNls String type, String containingClassName,
+ LightModifierList modifierList, PsiElement navigationalElement) {
+ super(modifierList, manager, name, type, navigationalElement);
myContainingClassName = containingClassName;
myProject = manager.getProject();
+ if (navigationalElement==null) {
+ myNavigationalElement = this;
+ }
+ else {
+ myNavigationalElement = navigationalElement;
+ }
}
@Nullable
}
public void navigate(boolean requestFocus) {
+ if (canNavigateToSource()) {
+ super.navigate(requestFocus);
+ return;
+ }
DynamicToolWindowWrapper.getInstance(myProject).getToolWindow().activate(new Runnable() {
public void run() {
DynamicToolWindowWrapper toolWindowWrapper = DynamicToolWindowWrapper.getInstance(myProject);
}
public boolean canNavigateToSource() {
- return false;
+ return myNavigationalElement != this;
+ }
+
+ @NotNull
+ @Override
+ public PsiElement getNavigationElement() {
+ return myNavigationalElement;
}
public boolean canNavigate() {
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightIdentifier;
import com.intellij.psi.impl.light.LightVariableBase;
-import com.intellij.psi.search.ProjectScope;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
}
public GrImplicitVariableImpl(PsiModifierList modifierList, PsiManager manager, @NonNls String name, @NonNls String type, PsiElement referenceExpression) {
- this(modifierList, manager, null,
- JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().
- createTypeByFQClassName(type, ProjectScope.getAllScope(manager.getProject())), false, referenceExpression);
+ this(modifierList, manager, null, JavaPsiFacade.getElementFactory(manager.getProject()).
+ createTypeFromText(type, referenceExpression), false, referenceExpression);
myNameIdentifier = new GrLightIdentifier(myManager, name);
}
public abstract class CompletionTestBase extends JavaCodeInsightFixtureTestCase {
protected void doTest() throws Throwable {
+ doTest("");
+ }
+ protected void doTest(String directory) throws Throwable {
final List<String> stringList = TestUtils.readInput(getTestDataPath() + "/" + getTestName(true) + ".test");
- final String fileName = getTestName(true) + "." + getExtension();
+ if (!directory.isEmpty()) directory += "/";
+ final String fileName = directory + getTestName(true) + "." + getExtension();
myFixture.addFileToProject(fileName, stringList.get(0));
myFixture.configureByFile(fileName);