mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
thread safe GroovyAnnotator
This commit is contained in:
@@ -267,7 +267,7 @@
|
||||
<!-- Groovy language -->
|
||||
<syntaxHighlighter key="Groovy" implementationClass="org.jetbrains.plugins.groovy.highlighter.GroovySyntaxHighlighter"/>
|
||||
|
||||
<annotator language="Groovy" implementationClass="org.jetbrains.plugins.groovy.annotator.GroovyAnnotator"/>
|
||||
<annotator language="Groovy" implementationClass="org.jetbrains.plugins.groovy.annotator.GrAnnotatorImpl"/>
|
||||
<annotator language="Groovy" implementationClass="org.jetbrains.plugins.groovy.dsl.GroovyDslAnnotator"/>
|
||||
|
||||
<lang.psiStructureViewFactory language="Groovy"
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2000-2013 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.annotator;
|
||||
|
||||
import com.intellij.lang.annotation.AnnotationHolder;
|
||||
import com.intellij.lang.annotation.Annotator;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrField;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
|
||||
|
||||
/**
|
||||
* @author Max Medvedev
|
||||
*/
|
||||
public class GrAnnotatorImpl implements Annotator {
|
||||
@Override
|
||||
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
|
||||
if (element instanceof GroovyPsiElement) {
|
||||
((GroovyPsiElement)element).accept(new GroovyAnnotator(holder));
|
||||
if (PsiUtil.isCompileStatic(element)) {
|
||||
GroovyAssignabilityCheckInspection.checkElement((GroovyPsiElement)element, holder);
|
||||
}
|
||||
}
|
||||
else {
|
||||
final PsiElement parent = element.getParent();
|
||||
if (parent instanceof GrMethod) {
|
||||
if (element.equals(((GrMethod)parent).getNameIdentifierGroovy()) && ((GrMethod)parent).getReturnTypeElementGroovy() == null) {
|
||||
GroovyAnnotator.checkMethodReturnType((GrMethod)parent, element, holder);
|
||||
}
|
||||
}
|
||||
else if (parent instanceof GrField) {
|
||||
final GrField field = (GrField)parent;
|
||||
if (element.equals(field.getNameIdentifierGroovy())) {
|
||||
final GrAccessorMethod[] getters = field.getGetters();
|
||||
for (GrAccessorMethod getter : getters) {
|
||||
GroovyAnnotator.checkMethodReturnType(getter, field.getNameIdentifierGroovy(), holder);
|
||||
}
|
||||
|
||||
final GrAccessorMethod setter = field.getSetter();
|
||||
if (setter != null) {
|
||||
GroovyAnnotator.checkMethodReturnType(setter, field.getNameIdentifierGroovy(), holder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,6 @@ import com.intellij.codeInsight.intention.QuickFixFactory;
|
||||
import com.intellij.lang.ASTNode;
|
||||
import com.intellij.lang.annotation.Annotation;
|
||||
import com.intellij.lang.annotation.AnnotationHolder;
|
||||
import com.intellij.lang.annotation.Annotator;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.project.IndexNotReadyException;
|
||||
@@ -47,7 +46,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.plugins.groovy.GroovyBundle;
|
||||
import org.jetbrains.plugins.groovy.annotator.intentions.*;
|
||||
import org.jetbrains.plugins.groovy.codeInspection.assignment.GroovyAssignabilityCheckInspection;
|
||||
import org.jetbrains.plugins.groovy.codeInspection.untypedUnresolvedAccess.GrUnresolvedAccessInspection;
|
||||
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
|
||||
import org.jetbrains.plugins.groovy.lang.documentation.GroovyPresentationUtil;
|
||||
@@ -81,7 +79,10 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrMethodCallExpression;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.*;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.*;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAnnotationMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMember;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.imports.GrImportStatement;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.toplevel.packaging.GrPackageDefinition;
|
||||
import org.jetbrains.plugins.groovy.lang.psi.api.types.*;
|
||||
@@ -104,43 +105,13 @@ import static org.jetbrains.plugins.groovy.highlighter.DefaultHighlighter.*;
|
||||
* @author ven
|
||||
*/
|
||||
@SuppressWarnings({"unchecked"})
|
||||
public class GroovyAnnotator extends GroovyElementVisitor implements Annotator {
|
||||
public class GroovyAnnotator extends GroovyElementVisitor {
|
||||
private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.annotator.GroovyAnnotator");
|
||||
|
||||
private AnnotationHolder myHolder;
|
||||
private final AnnotationHolder myHolder;
|
||||
|
||||
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
|
||||
if (element instanceof GroovyPsiElement) {
|
||||
myHolder = holder;
|
||||
((GroovyPsiElement)element).accept(this);
|
||||
if (PsiUtil.isCompileStatic(element)) {
|
||||
GroovyAssignabilityCheckInspection.checkElement((GroovyPsiElement)element, holder);
|
||||
}
|
||||
myHolder = null;
|
||||
}
|
||||
else {
|
||||
final PsiElement parent = element.getParent();
|
||||
if (parent instanceof GrMethod) {
|
||||
if (element.equals(((GrMethod)parent).getNameIdentifierGroovy()) &&
|
||||
((GrMethod)parent).getReturnTypeElementGroovy() == null) {
|
||||
checkMethodReturnType((GrMethod)parent, element, holder);
|
||||
}
|
||||
}
|
||||
else if (parent instanceof GrField) {
|
||||
final GrField field = (GrField)parent;
|
||||
if (element.equals(field.getNameIdentifierGroovy())) {
|
||||
final GrAccessorMethod[] getters = field.getGetters();
|
||||
for (GrAccessorMethod getter : getters) {
|
||||
checkMethodReturnType(getter, field.getNameIdentifierGroovy(), holder);
|
||||
}
|
||||
|
||||
final GrAccessorMethod setter = field.getSetter();
|
||||
if (setter != null) {
|
||||
checkMethodReturnType(setter, field.getNameIdentifierGroovy(), holder);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public GroovyAnnotator(@NotNull AnnotationHolder holder) {
|
||||
myHolder = holder;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -889,7 +860,7 @@ public class GroovyAnnotator extends GroovyElementVisitor implements Annotator {
|
||||
holder.createErrorAnnotation(element, GroovyBundle.message("unexpected.attribute.type.0", element.getType()));
|
||||
}
|
||||
|
||||
private static void checkMethodReturnType(PsiMethod method, PsiElement toHighlight, AnnotationHolder holder) {
|
||||
static void checkMethodReturnType(PsiMethod method, PsiElement toHighlight, AnnotationHolder holder) {
|
||||
final HierarchicalMethodSignature signature = method.getHierarchicalMethodSignature();
|
||||
final List<HierarchicalMethodSignature> superSignatures = signature.getSuperSignatures();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user