cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / jps / jps-builders / src / org / jetbrains / jps / builders / java / dependencyView / Callbacks.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.jps.builders.java.dependencyView;
3
4 import com.intellij.util.SmartList;
5 import org.jetbrains.org.objectweb.asm.ClassReader;
6
7 import java.io.File;
8 import java.util.Collection;
9 import java.util.Collections;
10 import java.util.concurrent.Future;
11
12 /**
13  * @author: db
14  */
15 public final class Callbacks {
16
17   public interface ConstantRef {
18     String getOwner();
19     String getName();
20     String getDescriptor();
21   }
22
23   public interface Backend {
24     void associate(String classFileName, String sourceFileName, ClassReader cr);
25     void associate(String classFileName, Collection<String> sources, ClassReader cr);
26     void registerImports(String className, Collection<String> classImports, Collection<String> staticImports);
27     void registerConstantReferences(String className, Collection<ConstantRef> cRefs);
28   }
29
30   public static ConstantRef createConstantReference(String ownerClass, String fieldName, String descriptor) {
31     return new ConstantRef() {
32       @Override
33       public String getOwner() {
34         return ownerClass;
35       }
36
37       @Override
38       public String getName() {
39         return fieldName;
40       }
41
42       @Override
43       public String getDescriptor() {
44         return descriptor;
45       }
46     };
47   }
48
49   public static class ConstantAffection {
50     public static final ConstantAffection EMPTY = new ConstantAffection();
51     private final boolean myKnown;
52     private final Collection<File> myAffectedFiles;
53
54     public ConstantAffection(final Collection<File> affectedFiles) {
55       myAffectedFiles = affectedFiles;
56       myKnown = true;
57     }
58
59     public ConstantAffection() {
60       myKnown = false;
61       myAffectedFiles = null;
62     }
63
64     public boolean isKnown(){
65       return myKnown;
66     }
67
68     public Collection<File> getAffectedFiles (){
69       return myAffectedFiles;
70     }
71
72     public static ConstantAffection compose(final Collection<? extends ConstantAffection> affections) {
73       if (affections.isEmpty()) {
74         return new ConstantAffection(Collections.emptyList()); // return a 'known' affection here
75       }
76       if (affections.size() == 1) {
77         return affections.iterator().next();
78       }
79       for (ConstantAffection a : affections) {
80         if (!a.isKnown()) {
81           return EMPTY;
82         }
83       }
84       final Collection<File> affected = new SmartList<>();
85       for (ConstantAffection affection : affections) {
86         affected.addAll(affection.getAffectedFiles());
87       }
88       return new ConstantAffection(affected);
89     }
90   }
91
92   /**
93    * @deprecated This functionality is obsolete and is not used by dependency analysis anymore.
94    * To be removed in later releases
95    */
96   @Deprecated
97   public interface ConstantAffectionResolver {
98     Future<ConstantAffection> request(
99       final String ownerClassName, final String fieldName, int accessFlags, boolean fieldRemoved, boolean accessChanged
100     );
101   }
102 }