PY-20744 Warn about illegal targets for variable annotations
[idea/community.git] / python / src / com / jetbrains / python / validation / PyAnnotatingVisitor.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.jetbrains.python.validation;
17
18 import com.intellij.lang.annotation.AnnotationHolder;
19 import com.intellij.lang.annotation.Annotator;
20 import com.intellij.openapi.diagnostic.Logger;
21 import com.intellij.psi.PsiElement;
22 import com.intellij.psi.PsiFile;
23 import com.jetbrains.python.psi.impl.PyFileImpl;
24 import org.jetbrains.annotations.NotNull;
25
26 import java.util.ArrayList;
27 import java.util.List;
28
29 /**
30  * @author yole
31  */
32 public class PyAnnotatingVisitor implements Annotator {
33   private static final Logger LOGGER = Logger.getInstance(PyAnnotatingVisitor.class.getName());
34   private static final Class[] ANNOTATOR_CLASSES = new Class[] {
35     AssignTargetAnnotator.class,
36     TypeAnnotationTargetAnnotator.class,
37     ParameterListAnnotator.class,
38     HighlightingAnnotator.class,
39     ReturnAnnotator.class,
40     TryExceptAnnotator.class,
41     BreakContinueAnnotator.class,
42     GlobalAnnotator.class,
43     ImportAnnotator.class,
44     PyBuiltinAnnotator.class,
45     UnsupportedFeatures.class
46   };
47
48   private final PyAnnotator[] myAnnotators;
49
50   public PyAnnotatingVisitor() {
51     final List<PyAnnotator> annotators = new ArrayList<>();
52     for (Class cls : ANNOTATOR_CLASSES) {
53       PyAnnotator annotator;
54       try {
55         annotator = (PyAnnotator)cls.newInstance();
56       }
57       catch (InstantiationException e) {
58         LOGGER.error(e);
59         continue;
60       }
61       catch (IllegalAccessException e) {
62         LOGGER.error(e);
63         continue;
64       }
65       annotators.add(annotator);
66     }
67     myAnnotators = annotators.toArray(new PyAnnotator[annotators.size()]);
68   }
69
70   public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) {
71     final PsiFile file = psiElement.getContainingFile();
72     for (PyAnnotator annotator : myAnnotators) {
73       if (file instanceof PyFileImpl && !((PyFileImpl)file).isAcceptedFor(annotator.getClass())) continue;
74       annotator.annotateElement(psiElement, holder);
75     }
76   }
77 }