gpp meta methods are not unused (IDEA-75803)
authorpeter <peter@jetbrains.com>
Mon, 30 Jan 2012 19:45:44 +0000 (20:45 +0100)
committerpeter <peter@jetbrains.com>
Tue, 31 Jan 2012 17:30:25 +0000 (18:30 +0100)
plugins/groovy/src/META-INF/plugin.xml
plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppImplicitUsageProvider.java [new file with mode: 0644]
plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GppFunctionalTest.groovy
plugins/groovy/testdata/highlighting/GloballyUnusedGppSymbols.groovy [new file with mode: 0644]

index 63f176ae28104d8cff5bf53cd30a221c45d9d19b..dfa3cd461c595c7ccfd6c863bddbc0a970d4d745 100644 (file)
                      groupName="Annotations verifying" enabledByDefault="true" level="WARNING"
                      implementationClass="org.jetbrains.plugins.groovy.annotator.inspections.GroovySingletonAnnotationInspection"/>
 
+    <implicitUsageProvider implementation="org.jetbrains.plugins.groovy.gpp.GppImplicitUsageProvider"/>
+
     <!-- control flow -->
     <intentionAction>
       <bundleName>org.jetbrains.plugins.groovy.intentions.GroovyIntentionsBundle</bundleName>
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppImplicitUsageProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/gpp/GppImplicitUsageProvider.java
new file mode 100644 (file)
index 0000000..2fd0935
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * 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.gpp;
+
+import com.intellij.codeInsight.daemon.ImplicitUsageProvider;
+import com.intellij.psi.*;
+
+/**
+ * @author peter
+ */
+public class GppImplicitUsageProvider implements ImplicitUsageProvider {
+
+  private static boolean isGppMetaMethod(PsiMethod method) {
+    PsiParameter[] parameters = method.getParameterList().getParameters();
+    if (parameters.length == 0 || !parameters[0].getType().equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
+      return false;
+    }
+    
+    if ("invokeUnresolvedMethod".equals(method.getName())) {
+      return true;
+    }
+    if ("getUnresolvedProperty".equals(method.getName())) {
+      return parameters.length == 1;
+    }
+    if ("setUnresolvedProperty".equals(method.getName())) {
+      return parameters.length == 2;
+    }
+
+    return false;
+  }
+  
+  @Override
+  public boolean isImplicitUsage(PsiElement element) {
+    return element instanceof PsiMethod && isGppMetaMethod((PsiMethod)element);
+  }
+
+  @Override
+  public boolean isImplicitRead(PsiElement element) {
+    return false;
+  }
+
+  @Override
+  public boolean isImplicitWrite(PsiElement element) {
+    return false;
+  }
+}
index 92c59b747b0382f9689683146d3f58510841b12b..1d578702c34b08e453b178daff16d7240e0d7805 100644 (file)
@@ -20,6 +20,8 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefini
 import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod
 import org.jetbrains.plugins.groovy.util.TestUtils
 import com.intellij.psi.*
+import org.jetbrains.plugins.groovy.codeInspection.GroovyUnusedDeclarationInspection
+import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection
 
 /**
  * @author peter
@@ -581,6 +583,22 @@ def bar() {
     myFixture.checkHighlighting(true, false, false)
   }
 
+  public void testUsedInterceptors() {
+    configureGppScript '''
+class Bar {
+  Object getUnresolvedProperty(String name) {}
+  Object <warning descr="Method getUnresolvedProperty is unused">getUnresolvedProperty</warning>(int name) {}
+  void setUnresolvedProperty(String name, String value) {}
+  int invokeUnresolvedMethod(String name, String arg1, boolean arg2, Object... args) {}
+  int invokeUnresolvedMethod(String name, Object... args) {}
+  int <warning descr="Method invokeUnresolvedMethod is unused">invokeUnresolvedMethod</warning>(Object... args) {}
+}
+println new Bar().zzz
+'''
+    myFixture.enableInspections(new GroovyUnusedDeclarationInspection(), new UnusedDeclarationInspection())
+    myFixture.checkHighlighting(true, false, false)
+  }
+
 }
 
 class GppProjectDescriptor extends DefaultLightProjectDescriptor {
diff --git a/plugins/groovy/testdata/highlighting/GloballyUnusedGppSymbols.groovy b/plugins/groovy/testdata/highlighting/GloballyUnusedGppSymbols.groovy
new file mode 100644 (file)
index 0000000..115ff12
--- /dev/null
@@ -0,0 +1,5 @@
+@Typed package foo;
+class Bar {
+
+}
+println new Bar().zzz