summaryrefslogtreecommitdiff
path: root/plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java')
-rw-r--r--plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java99
1 files changed, 99 insertions, 0 deletions
diff --git a/plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java b/plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java
new file mode 100644
index 000000000000..3637b97c111d
--- /dev/null
+++ b/plugins/groovy/structuralsearch-groovy/src/com/intellij/structuralsearch/GroovyEquivalenceDescriptorProvider.java
@@ -0,0 +1,99 @@
+package com.intellij.structuralsearch;
+
+import com.intellij.dupLocator.equivalence.EquivalenceDescriptor;
+import com.intellij.dupLocator.equivalence.EquivalenceDescriptorBuilder;
+import com.intellij.dupLocator.equivalence.EquivalenceDescriptorProvider;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.tree.TokenSet;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.plugins.groovy.GroovyLanguage;
+import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariable;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrVariableDeclaration;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrForInClause;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrReferenceList;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody;
+import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
+import org.jetbrains.plugins.groovy.lang.psi.api.util.GrStatementOwner;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class GroovyEquivalenceDescriptorProvider extends EquivalenceDescriptorProvider {
+ private static final TokenSet IGNORED_TOKENS = TokenSet.orSet(TokenSets.WHITE_SPACES_OR_COMMENTS, TokenSets.SEPARATORS);
+
+ @Override
+ public boolean isMyContext(@NotNull PsiElement context) {
+ return context.getLanguage().isKindOf(GroovyLanguage.INSTANCE);
+ }
+
+ @Override
+ public EquivalenceDescriptor buildDescriptor(@NotNull PsiElement e) {
+ final EquivalenceDescriptorBuilder builder = new EquivalenceDescriptorBuilder();
+
+ if (e instanceof GrVariableDeclaration) {
+ return builder.elements(((GrVariableDeclaration)e).getVariables());
+ }
+ else if (e instanceof GrParameter) {
+ final GrParameter p = (GrParameter)e;
+ return builder
+ .element(p.getNameIdentifierGroovy())
+ .optionally(p.getTypeElementGroovy())
+ .optionallyInPattern(p.getInitializerGroovy());
+ }
+ else if (e instanceof GrVariable) {
+ final GrVariable v = (GrVariable)e;
+ return builder
+ .element(v.getNameIdentifierGroovy())
+ .optionally(v.getTypeElementGroovy())
+ .optionallyInPattern(v.getInitializerGroovy());
+ }
+ else if (e instanceof GrMethod) {
+ final GrMethod m = (GrMethod)e;
+ return builder
+ .element(m.getNameIdentifierGroovy())
+ .elements(m.getParameters())
+ .optionally(m.getReturnTypeElementGroovy())
+ .optionallyInPattern(m.getBlock());
+ }
+ else if (e instanceof GrTypeDefinitionBody) {
+ final GrTypeDefinitionBody b = (GrTypeDefinitionBody)e;
+ return builder
+ .inAnyOrder(b.getFields())
+ .inAnyOrder(b.getMethods())
+ .inAnyOrder(b.getInitializers())
+ .inAnyOrder(b.getInnerClasses());
+ }
+ else if (e instanceof GrTypeDefinition) {
+ GrTypeDefinition d = (GrTypeDefinition)e;
+ return builder.element(d.getNameIdentifierGroovy())
+ .optionallyInPattern(d.getExtendsClause())
+ .optionallyInPattern(d.getImplementsClause())
+ .optionallyInPattern(d.getBody());
+ }
+ else if (e instanceof GrForInClause) {
+ final GrForInClause f = (GrForInClause)e;
+ return builder
+ .element(f.getDeclaredVariable())
+ .element(f.getIteratedExpression());
+ }
+ else if (e instanceof GrReferenceList) {
+ return builder.inAnyOrder(((GrReferenceList)e).getReferenceElementsGroovy());
+ }
+ else if (e instanceof GrCodeBlock) {
+ return builder.codeBlock(((GrStatementOwner)e).getStatements());
+ }
+
+ // todo: support 'object method()' <-> 'object.method()'
+
+ return null;
+ }
+
+ @Override
+ public TokenSet getIgnoredTokens() {
+ return IGNORED_TOKENS;
+ }
+}