2191903e779f8e45997ff05ca809469d605446b9
[idea/community.git] / jps / jps-builders / src / org / jetbrains / jps / builders / java / dependencyView / Callbacks.java
1 /*
2  * Copyright 2000-2012 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 org.jetbrains.jps.builders.java.dependencyView;
17
18 import com.intellij.util.SmartList;
19 import org.jetbrains.org.objectweb.asm.ClassReader;
20
21 import java.io.File;
22 import java.util.Collection;
23 import java.util.Collections;
24 import java.util.concurrent.Future;
25
26 /**
27  * @author: db
28  */
29 public class Callbacks {
30
31   public interface ConstantRef {
32     String getOwner();
33     String getName();
34     String getDescriptor();
35   }
36
37   public interface Backend {
38     void associate(String classFileName, String sourceFileName, ClassReader cr);
39     void associate(String classFileName, Collection<String> sources, ClassReader cr);
40     void registerImports(String className, Collection<String> classImports, Collection<String> staticImports);
41     void registerConstantReferences(String className, Collection<ConstantRef> cRefs);
42   }
43
44   public static ConstantRef createConstantReference(String ownerClass, String fieldName, String descriptor) {
45     return new ConstantRef() {
46       @Override
47       public String getOwner() {
48         return ownerClass;
49       }
50
51       @Override
52       public String getName() {
53         return fieldName;
54       }
55
56       @Override
57       public String getDescriptor() {
58         return descriptor;
59       }
60     };
61   }
62
63   public static class ConstantAffection {
64     public static final ConstantAffection EMPTY = new ConstantAffection();
65     private final boolean myKnown;
66     private final Collection<File> myAffectedFiles;
67
68     public ConstantAffection(final Collection<File> affectedFiles) {
69       myAffectedFiles = affectedFiles;
70       myKnown = true;
71     }
72
73     public ConstantAffection() {
74       myKnown = false;
75       myAffectedFiles = null;
76     }
77
78     public boolean isKnown(){
79       return myKnown;
80     }
81
82     public Collection<File> getAffectedFiles (){
83       return myAffectedFiles;
84     }
85
86     public static ConstantAffection compose(final Collection<? extends ConstantAffection> affections) {
87       if (affections.isEmpty()) {
88         return new ConstantAffection(Collections.emptyList()); // return a 'known' affection here
89       }
90       if (affections.size() == 1) {
91         return affections.iterator().next();
92       }
93       for (ConstantAffection a : affections) {
94         if (!a.isKnown()) {
95           return EMPTY;
96         }
97       }
98       final Collection<File> affected = new SmartList<>();
99       for (ConstantAffection affection : affections) {
100         affected.addAll(affection.getAffectedFiles());
101       }
102       return new ConstantAffection(affected);
103     }
104   }
105
106   /**
107    * @deprecated This functionality is obsolete and is not used by dependency analysis anymore.
108    * To be removed in later releases
109    */
110   @Deprecated
111   public interface ConstantAffectionResolver {
112     Future<ConstantAffection> request(
113       final String ownerClassName, final String fieldName, int accessFlags, boolean fieldRemoved, boolean accessChanged
114     );
115   }
116 }