diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index d3b98eb..7e085f3 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -9,8 +9,6 @@
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeAnalyzer.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeAnalyzer.java
deleted file mode 100644
index 92127ae..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeAnalyzer.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.SyntaxTree;
-import com.apkide.analysis.api.clm.Type;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.collections.SetOfInt;
-
-public interface CodeAnalyzer {
- Type analyzeTypeName(SyntaxTree ast, int var2, int var3, String name) throws UnknownEntityException;
-
- void analyzeImports(SyntaxTree ast);
-
- void analyzeEveryIdentifiers(SyntaxTree ast, SetOfInt identifiers);
-
- void analyzeEveryIdentifier(SyntaxTree ast, int identifier);
-
- void analyzeNode(SyntaxTree ast, int node);
-
- void analyzeNodeWithValues(SyntaxTree ast, int node);
-
- void analyzeNamesAndTypes(SyntaxTree ast);
-
- void analyzeErrors(SyntaxTree ast);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeModel.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeModel.java
deleted file mode 100644
index 1251255..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeModel.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.List;
-
-public interface CodeModel {
- @NonNull
- String getName();
-
- @NonNull
- String[] getDefaultFilePatterns();
-
- @NonNull
- List getLanguages();
-
- void update();
-
- boolean isSupportsFileArchives();
-
- long getArchiveVersion(String filePath);
-
- Reader getArchiveEntryReader(String filePath,String entryName,String encoding)throws IOException;
-
- String[] getArchiveEntries(String filePath)throws IOException;
-
- void close();
-
- @Nullable
- Compiler getCompiler();
-
- @Nullable
- Preprocessor getPreprocessor();
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeRenderer.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeRenderer.java
deleted file mode 100644
index 78e7335..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/CodeRenderer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.ClassType;
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.Namespace;
-import com.apkide.analysis.api.clm.SyntaxTree;
-import com.apkide.analysis.api.clm.Type;
-import com.apkide.analysis.api.clm.Variable;
-import com.apkide.analysis.api.clm.collections.MapOf;
-import com.apkide.analysis.api.clm.collections.SetOf;
-
-public interface CodeRenderer {
- String renderParameter(String typeName, String identifier);
-
- String renderTypeName(SyntaxTree ast, int line, int column, Type type);
-
- String renderDefaultValueString(Type type);
-
- String renderStaticImports(SyntaxTree ast, MapOf imports);
-
- String renderFileNamespace(Namespace namespace);
-
- String renderClassNamespaceStart(Namespace namespace);
-
- String renderClassNamespaceEnd(Namespace namespace);
-
- String renderImports(SyntaxTree ast, MapOf imports);
-
- String renderImports(SyntaxTree ast, int line, int column, SetOf extends Type> imports);
-
- String renderImports(SyntaxTree ast, int line, int column, SetOf extends Type> imports, SetOf set);
-
- String getModifierString(int modifier);
-
- String getHTMLString(Variable variable);
-
- String getNameString(Entity entity);
-
- String getFullyQualifiedNameString(Entity entity);
-
- String getHTMLString(Entity entity);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Compiler.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/Compiler.java
deleted file mode 100644
index 7583a68..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Compiler.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.SyntaxTree;
-
-public interface Compiler {
- void compile(SyntaxTree ast, boolean createDebugMetadata);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Language.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/Language.java
deleted file mode 100644
index ac4d7c9..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Language.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import java.util.Set;
-
-public interface Language {
-
- @NonNull
- String getName();
-
- boolean isParenChar(char c);
-
- void shrink();
-
- @Nullable
- Set> getDefaultOptions();
-
- @Nullable
- Syntax getSyntax();
-
- @Nullable
- Tools getTools();
-
- @Nullable
- SignatureAnalyzer getSignatureAnalyzer();
-
- @Nullable
- TypeSystem getTypeSystem();
-
- @Nullable
- CodeRenderer getRenderer();
-
- @Nullable
- CodeAnalyzer getAnalyzer();
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Preprocessor.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/Preprocessor.java
deleted file mode 100644
index bbe6af4..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Preprocessor.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.SyntaxTree;
-
-import java.io.Reader;
-
-public interface Preprocessor {
- char POS_ESCAPE_CHAR = '\uFFEE';
-
- void processVersion(FileEntry fileEntry);
-
- Reader process(FileEntry fileEntry, Reader reader, SyntaxTree ast);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/SignatureAnalyzer.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/SignatureAnalyzer.java
deleted file mode 100644
index c0d627c..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/SignatureAnalyzer.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.ClassType;
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.Member;
-import com.apkide.analysis.api.clm.SyntaxTree;
-
-public interface SignatureAnalyzer {
- long getDeclarationDigest(SyntaxTree ast);
-
- long getPublicDeclarationDigest(SyntaxTree ast);
-
- long getClassDeclarationDigest(SyntaxTree ast);
-
- void doLoadNamespaces(FileEntry fileEntry);
-
- void doLoadPositions(FileEntry fileEntry);
-
- void doLoadTypes(FileEntry fileEntry);
-
- void doLoadSyntax(FileEntry fileEntry);
-
- void doLoadSuperClassTypes(FileEntry fileEntry, ClassType classtype);
-
- void doLoadDefaultSuperClassTypes(FileEntry fileEntry, ClassType classtype);
-
- void doLoadBoundTypes(FileEntry fileEntry, ClassType classtype);
-
- void doLoadSuperTypes(FileEntry fileEntry, ClassType classtype);
-
- void doLoadConstantValueOfField(FileEntry fileEntry, Member member);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Syntax.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/Syntax.java
deleted file mode 100644
index 9d1866a..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Syntax.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.SyntaxTree;
-import com.apkide.common.collections.ListOfInt;
-
-public interface Syntax {
-
- boolean isParameters(int syntaxTag);
-
- boolean isMethodDeclaration(int syntaxTag);
-
- boolean isFieldDeclaration(int syntaxTag);
-
- boolean isArguments(int syntaxTag);
-
- boolean isClassBody(int syntaxTag);
-
- boolean isBlock(int syntaxTag);
-
- boolean isIdentifier(int syntaxTag);
-
- boolean isExpression(int syntaxTag);
-
- boolean isStatement(int syntaxTag);
-
- boolean isMemberDeclaration(int syntaxTag);
-
- boolean isClassDeclaration(int syntaxTag);
-
- boolean isLiteral(int syntaxTag);
-
- boolean isToken(int syntaxTag);
-
- int getOperator(int syntaxTag);
-
- int getOperatorPriority(int syntaxTag);
-
- String getString(int syntaxTag);
-
- int getTokenLength(int syntaxTag);
-
- int getIdentifierForKeyword(int syntaxTag);
-
- boolean hasAttrVariableSlot(int syntaxTag);
-
- boolean hasAttrDAIndex(int syntaxTag);
-
- boolean hasAttrTarget(int syntaxTag);
-
- boolean hasAttrType(int syntaxTag);
-
- boolean hasAttrValue(int syntaxTag);
-
- boolean isDeclarationIdentifierNode(SyntaxTree ast, int node);
-
- boolean isPublicSignatureIdentifierNode(SyntaxTree ast, int node);
-
- boolean isNonQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
-
- boolean isQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
-
- int getQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
-
- int getTypeIdentifierNodeArgumentCount(SyntaxTree ast, int node);
-
- boolean isFieldIdentifierNode(SyntaxTree ast, int node);
-
- boolean isAssignedExpressionNode(SyntaxTree ast, int node);
-
- boolean isChangedExpressionNode(SyntaxTree ast, int node);
-
- int getParameterNodeOfParametersNode(SyntaxTree ast, int node, int i);
-
- int getLeftParenNodeOfParametersNode(SyntaxTree ast, int node);
-
- int getRightParenNodeOfParametersNode(SyntaxTree ast, int node);
-
- int getArgumentNodeOfArgumentsNode(SyntaxTree ast, int node, int i);
-
- int getArgumentCountOfArgumentsNode(SyntaxTree ast, int node);
-
- int getLeftParenNodeOfArgumentsNode(SyntaxTree ast, int node);
-
- int getRightParenNodeOfArgumentsNode(SyntaxTree ast, int node);
-
- ListOfInt getNamespaceNodePairs(SyntaxTree ast);
-
- ListOfInt getImportNodePairs(SyntaxTree ast);
-
- int getImportStartLine(SyntaxTree ast);
-
- int getImportStartColumn(SyntaxTree ast);
-
- int getImportEndLine(SyntaxTree ast);
-
- int getImportEndColumn(SyntaxTree ast);
-
- String getHTMLDocCommentString(SyntaxTree ast, int node);
-
- boolean hasHTMLDocCommentString(SyntaxTree ast, int node);
-
- String getRawDocCommentString(SyntaxTree ast, int node);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Tools.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/Tools.java
deleted file mode 100644
index 7349fa1..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/Tools.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.Member;
-import com.apkide.analysis.api.clm.Type;
-
-public interface Tools {
- boolean isHighlighted();
-
- void requestParameterList(FileEntry fileEntry, int line, int column);
-
- void requestCompletionList(FileEntry fileEntry, int line, int column);
-
- void requestClassesCompletionList(FileEntry fileEntry);
-
- void requestSuperMethodsCompletionList(FileEntry fileEntry, int line, int column);
-
- void documentize(FileEntry fileEntry, int line, int column);
-
- void documentize(FileEntry fileEntry);
-
- void surroundWithTryCatch(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
-
- void addThrows(FileEntry fileEntry, int line, int column);
-
- void safeDelete(Entity entity);
-
- void createVariable(FileEntry fileEntry, int line, int column, int identifier, Type type);
-
- void createField(FileEntry fileEntry, int line, int column, int modifiers, int identifier, Type type);
-
- void createMethod(FileEntry fileEntry, int line, int column, int modifiers, int identifier, Type type, int[] argModifiers, Type[] argTypes, int[] argNames);
-
- void inlineVariable(FileEntry fileEntry,int line, int column);
-
- void createSettersAndGetters(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
-
- void createConstructor(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
-
- void extractMethod(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
-
- void implementMembers(FileEntry fileEntry, int line, int column);
-
- void overrideMember(FileEntry fileEntry, int line, int column, Member member);
-
- void introduceVariable(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
-
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/cle/TypeSystem.java b/analysis-api/src/main/java/com/apkide/analysis/api/cle/TypeSystem.java
deleted file mode 100644
index 0defc2d..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/cle/TypeSystem.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.apkide.analysis.api.cle;
-
-import com.apkide.analysis.api.clm.ClassType;
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.Namespace;
-import com.apkide.analysis.api.clm.Type;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-
-public interface TypeSystem {
- boolean hasTypeparametersOfEnclosingClasstype();
-
- boolean inheritsBoundTypes();
-
- boolean supportsGenericTypeNameResolving();
-
- boolean supportsMethodParametertypeVariables();
-
- Type getConditionalOperationType(FileEntry fileEntry, Type type1, Type type2) throws UnknownEntityException;
-
- Type getBinaryNumericOperationType(FileEntry fileEntry, int operator, Type type1, Type type2) throws UnknownEntityException;
-
- boolean isImplicitConversion(FileEntry fileEntry, Type type1, Type type2);
-
- boolean isExplicitConversion(FileEntry fileEntry, Type type1, Type type2);
-
- int getTypeSemanticForClasstype(Namespace namespace, int identifier);
-
- int getTypeSemanticForPrimitivetype(int number);
-
- ClassType getRootClasstype(FileEntry fileEntry) throws UnknownEntityException;
-
- ClassType getArraySuperClasstype(FileEntry fileEntry) throws UnknownEntityException;
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ArrayType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/ArrayType.java
deleted file mode 100644
index a9f9d8e..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ArrayType.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import static com.apkide.analysis.api.clm.TypeSemantic.UNKNOWN_SEMANTIC;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class ArrayType extends Type {
- private final EntitySpace space;
- private int id;
- private Type elementtype;
- private int dimension;
-
- protected ArrayType(FileSpace fileSpace, EntitySpace space) {
- super(fileSpace,space, UNKNOWN_SEMANTIC);
- this.space = space;
- }
-
- protected ArrayType(FileSpace fileSpace, EntitySpace space, Type elementtype, int dimension) {
- super(fileSpace,space, UNKNOWN_SEMANTIC);
- this.space = space;
- this.id = space.declareEntity(this);
- this.elementtype = elementtype;
- this.dimension = dimension;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.id = stream.readInt();
- this.elementtype = (Type)this.space.getEntity(stream.readInt());
- this.dimension = stream.readInt();
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.id);
- stream.writeInt(this.space.getID(this.elementtype));
- stream.writeInt(this.dimension);
- }
-
- public Type getComponenttype() {
- Type type = this.getElementType();
-
- while(type.isArrayType()) {
- type = ((ArrayType)type).getElementType();
- }
-
- return type;
- }
-
- public int getDimension() {
- return this.dimension;
- }
-
- public Type getElementType() {
- return this.elementtype;
- }
-
- @Override
- public Language getLanguage() {
- return this.getElementType().getLanguage();
- }
-
- @Override
- public int getID() {
- return this.id;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Entity.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/Entity.java
deleted file mode 100644
index db8f514..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Entity.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public abstract class Entity {
- private final FileSpace myFileSpace;
- private final EntitySpace mySpace;
- private int myLanguageID;
-
- public Entity(FileSpace fileSpace, EntitySpace space) {
- this.myFileSpace = fileSpace;
- this.mySpace = space;
- }
-
- public void configureLanguage(@NonNull Language language) {
- myLanguageID = myFileSpace.getLanguageID(language);
- }
-
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- myLanguageID = stream.readInt();
- }
-
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- stream.writeInt(myLanguageID);
- }
-
- public boolean isPrivateVisibleFrom(Entity entity) {
- if (this.getFile() != entity.getFile()) {
- return false;
- } else {
- ClassType classType1 = this.getEnclosingClassType();
- ClassType classType2 = entity.getEnclosingClassType();
- return classType1.isEnclosedBy(classType2);
- }
- }
-
- public String getHTMLString() {
- return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getHTMLString(this) : "";
- }
-
- public int getIdentifier() {
- return 0;
- }
-
- public boolean isType() {
- return this instanceof Type;
- }
-
- public boolean isNamespace() {
- return this instanceof Namespace;
- }
-
- public boolean isMethodParametertypeVariable() {
- return this instanceof MethodParametertypeVariable;
- }
-
- public boolean isMember() {
- return this instanceof Member;
- }
-
- public boolean isArrayType() {
- return this instanceof ArrayType;
- }
-
- public boolean isPointerType() {
- return this instanceof PointerType;
- }
-
- public boolean isPrimitiveType() {
- return this instanceof PrimitiveType;
- }
-
- public boolean isClassType() {
- return this instanceof ClassType;
- }
-
- public boolean isParameterType() {
- return this instanceof ParameterType;
- }
-
- public boolean isMethodParameterType() {
- return this instanceof MethodParameterType;
- }
-
- public boolean isParameterizedType() {
- return this instanceof ParameterizedType;
- }
-
- public int getID() {
- return 0;
- }
-
- public int getModifiers() {
- return 0;
- }
-
- public boolean isPrivate() {
- return Modifiers.isJavaPrivate(this.getModifiers()) || Modifiers.isCSPrivate(this.getModifiers());
- }
-
- public boolean isFilePrivate() {
- return this.isPrivate();
- }
-
- public ClassType getEnclosingClassType() {
- return null;
- }
-
- public Language getLanguage() {
- return myFileSpace.getLanguage(myLanguageID);
- }
-
- public ClassType getEnclosingTopLevelClassType() {
- return null;
- }
-
- public String getDocumentationString() {
- return this.mySpace.getDocumentationString(this);
- }
-
- public String getHTMLDocumentationString() {
- return this.mySpace.getHTMLDocumentationString(this);
- }
-
- public FileEntry getFile() {
- return null;
- }
-
- public int getDeclarationNumber() {
- return -1;
- }
-
- public String getFullyQualifiedNameString() {
- return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getFullyQualifiedNameString(this) : "";
- }
-
- public String getNameString() {
- return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getNameString(this) : "";
- }
-
- public int getIdentifierLine() {
- return 0;
- }
-
- public int getIdentifierEndColumn() {
- return 0;
- }
-
- public int getIdentifierStartColumn() {
- return 0;
- }
-
- public int getModifiersStartLine() {
- return 0;
- }
-
- public int getModifiersEndLine() {
- return 0;
- }
-
- public int getModifiersEndColumn() {
- return 0;
- }
-
- public int getModifiersStartColumn() {
- return 0;
- }
-
- public int getEndColumn() {
- return 0;
- }
-
- public int getEndLine() {
- return 0;
- }
-
- public int getStartColumn() {
- return 0;
- }
-
- public int getStartLine() {
- return 0;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/FileSpace.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/FileSpace.java
deleted file mode 100644
index 49764b5..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/FileSpace.java
+++ /dev/null
@@ -1,764 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.callback.FileReaderCallback;
-import com.apkide.analysis.api.clm.callback.OpenFileCallback;
-import com.apkide.analysis.api.clm.callback.StopCallback;
-import com.apkide.analysis.api.clm.collections.RelationOfIntInt;
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.FunctionOfIntInt;
-import com.apkide.common.collections.MapOfIntLong;
-import com.apkide.common.collections.OrderedMapOfIntInt;
-import com.apkide.common.collections.SetOfInt;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-public class FileSpace {
- private final IdentifierSpace identifiers;
- private final OpenFileCallback openfilecallback;
- private final StopCallback stopcallback;
- private CompletionReader completionReader = new CompletionReader();
- private MapOfIntLong includedEntryVersions;
- private OrderedMapOfIntInt includes;
- private FileEntry currentIncludeFile;
- private SetOfInt changedIncludeFiles = new SetOfInt();
- private SetOfInt changedFiles = new SetOfInt();
- private String encoding;
- private FileEntry[] entries;
- private int entryCount;
- private FunctionOfIntInt fileCodeModels;
- private FunctionOfIntInt fileassemblys;
- private RelationOfIntInt references;
- private OrderedMapOfIntInt assemblyreferences;
- private SetOfFileEntry registeredcheckedfiles;
- private SetOfFileEntry registeredsolutionfiles;
- private SetOfFileEntry registeredresourcefiles;
- private SetOfFileEntry checkedfiles;
- private SetOfFileEntry solutionfiles;
- private HashMap resourcepackagenames;
- private HashMap assemblyProjectFilePaths;
- private HashMap assemblyRootNamespaces;
- private HashMap> assemblyTagLibs;
- private HashMap> assemblyDefaultImports;
- private HashMap> assemblyDefinedSymbols;
- private HashMap assemblyDestinations;
- private HashMap assemblyTargetVersions;
- private HashMap assemblyConfigurations;
- private HashMap> myCodeModelFilePatterns;
- private CodeModel[] myCodeModels;
- private Language[] languages;
- private boolean packed;
- private FileReaderCallback myFileReaderCallback;
-
- public FileSpace(IdentifierSpace identifiers, OpenFileCallback openfilecallback, StopCallback stopcallback,FileReaderCallback fileReaderCallback) {
- this.identifiers = identifiers;
- this.openfilecallback = openfilecallback;
- this.stopcallback = stopcallback;
- this.myFileReaderCallback=fileReaderCallback;
- this.entries = new FileEntry[1000];
- this.entries[0] = new FileEntry(identifiers, this, openfilecallback, identifiers.get(""), null);
- this.entryCount = 1;
- this.includedEntryVersions = new MapOfIntLong();
- this.includes = new OrderedMapOfIntInt();
- this.fileCodeModels = new FunctionOfIntInt();
- this.fileassemblys = new FunctionOfIntInt();
- this.references = new RelationOfIntInt();
- this.assemblyreferences = new OrderedMapOfIntInt();
- this.registeredcheckedfiles = new SetOfFileEntry(this);
- this.registeredsolutionfiles = new SetOfFileEntry(this);
- this.registeredresourcefiles = new SetOfFileEntry(this);
- this.checkedfiles = new SetOfFileEntry(this);
- this.solutionfiles = new SetOfFileEntry(this);
- this.assemblyDestinations = new HashMap<>();
- this.assemblyProjectFilePaths = new HashMap<>();
- this.assemblyTagLibs = new HashMap<>();
- this.assemblyDefaultImports = new HashMap<>();
- this.assemblyDefinedSymbols = new HashMap<>();
- this.assemblyRootNamespaces = new HashMap<>();
- this.assemblyTargetVersions = new HashMap<>();
- this.assemblyConfigurations = new HashMap<>();
- this.resourcepackagenames = new HashMap<>();
- this.myCodeModelFilePatterns=new HashMap<>();
- }
-
- public void configureCodeModelFilePatterns(CodeModel codeModel,List filePatterns){
- myCodeModelFilePatterns.put(codeModel,filePatterns);
- }
-
- public void configureCodeModels(CodeModel[] codeModels) {
- myCodeModels = codeModels;
- List languageList = new ArrayList<>();
- for (CodeModel codeModel : myCodeModels) {
- if (codeModel != null) {
- for (Language language : codeModel.getLanguages()) {
- if (!languageList.contains(language))
- languageList.add(language);
- }
- }
- }
- languages = languageList.toArray(new Language[0]);
- }
-
- public void close() {
- for (CodeModel codeModel : myCodeModels) {
- if (codeModel != null && codeModel.isSupportsFileArchives())
- codeModel.close();
- }
- }
-
- public void storeEntries(StoreOutputStream stream) throws IOException {
- stream.writeInt(this.entryCount);
- }
-
- public void loadEntries(StoreInputStream stream) throws IOException {
- this.entryCount = stream.readInt();
- this.entries = new FileEntry[this.entryCount * 2];
-
- for (int i = 0; i < this.entryCount; ++i) {
- this.entries[i] = new FileEntry(this.identifiers, this, this.openfilecallback);
- }
- }
-
- protected void load(StoreInputStream stream) throws IOException {
- for (int i = 0; i < this.entryCount; ++i) {
- this.entries[i].load(stream);
- if (stream.readChar() != 'E') {
- throw new IOException();
- }
- }
-
- this.includedEntryVersions = new MapOfIntLong(stream);
- this.includes = new OrderedMapOfIntInt(stream);
- this.fileCodeModels = new FunctionOfIntInt(stream);
- }
-
- protected void store(StoreOutputStream stream) throws IOException {
- for (int i = 0; i < this.entryCount; ++i) {
- this.entries[i].store(stream);
- stream.writeChar(69);
- }
-
- this.includedEntryVersions.store(stream);
- this.includes.store(stream);
- this.fileCodeModels.store(stream);
- }
-
- protected void update(boolean updateFileSpace) {
- if (updateFileSpace) {
- this.synchronize();
- }
-
- this.changedIncludeFiles.clear();
- this.includedEntryVersions.DEFAULT_ITERATOR.init();
-
- while (this.includedEntryVersions.DEFAULT_ITERATOR.hasMoreElements()) {
- FileEntry entry = this.getFileEntry(this.includedEntryVersions.DEFAULT_ITERATOR.nextKey());
- long version = this.includedEntryVersions.DEFAULT_ITERATOR.nextValue();
- if (version != entry.getVersion()) {
- this.changedIncludeFiles.put(entry.getID());
- }
- }
-
- this.changedIncludeFiles.DEFAULT_ITERATOR.init();
-
- while (this.changedIncludeFiles.DEFAULT_ITERATOR.hasMoreElements()) {
- this.includedEntryVersions.remove(this.changedIncludeFiles.DEFAULT_ITERATOR.nextKey());
- }
-
- this.changedFiles.clear();
- this.includes.DEFAULT_ITERATOR.init();
-
- while (this.includes.DEFAULT_ITERATOR.hasMoreElements()) {
- FileEntry entry = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextValue());
- FileEntry file = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextKey());
- if (this.changedIncludeFiles.contains(entry.getID())) {
- this.changedFiles.put(file.getID());
- }
- }
-
- this.changedFiles.DEFAULT_ITERATOR.init();
-
- while (this.changedFiles.DEFAULT_ITERATOR.hasMoreElements()) {
- this.includes.remove(this.changedFiles.DEFAULT_ITERATOR.nextKey());
- }
- }
-
- private void synchronize() {
- for (FileEntry entry : this.entries) {
- if (entry != null) {
- entry.synchronize();
- }
- }
-
- this.packed = false;
- }
-
- public CodeModel[] getCodeModels() {
- return myCodeModels;
- }
-
- protected int getCodeModelID(CodeModel codeModel) {
- for (int i = 0; i < this.myCodeModels.length; ++i) {
- if (codeModel == this.myCodeModels[i]) {
- return i;
- }
- }
-
- return -1;
- }
-
- protected CodeModel getCodeModel(int id) {
- return id < 0 ? null : this.myCodeModels[id];
- }
-
-
- public Language[] getLanguages() {
- return this.languages;
- }
-
- protected int getLanguageID(Language language) {
- for (int i = 0; i < this.languages.length; ++i) {
- if (language == this.languages[i]) {
- return i;
- }
- }
-
- return -1;
- }
-
- protected Language getLanguage(int id) {
- return id < 0 ? null : this.languages[id];
- }
-
- protected int getAssembly(FileEntry file) {
- this.pack();
- return this.fileassemblys.get(file.getID());
- }
-
- protected String getRootNamespace(FileEntry file) {
- int assembly = file.getAssembly();
- return this.assemblyRootNamespaces.containsKey(assembly) ? this.assemblyRootNamespaces.get(assembly) : "";
- }
-
- protected List getDefaultImports(FileEntry file) {
- return this.assemblyDefaultImports.get(file.getAssembly());
- }
-
- protected List getDefinedSymbols(FileEntry file) {
- return this.assemblyDefinedSymbols.get(file.getAssembly());
- }
-
- protected void configureEncoding(String encoding) {
- this.encoding = encoding;
- }
-
- protected void configureAssembly(
- int assembly, String projectFilePath, String rootNamespace, List defaultImports, List definedSymbols, List tagLibPaths
- ) {
- this.assemblyProjectFilePaths.put(assembly, projectFilePath);
- this.assemblyRootNamespaces.put(assembly, rootNamespace);
- this.assemblyTagLibs.put(assembly, tagLibPaths);
- this.assemblyDefaultImports.put(assembly, defaultImports);
- this.assemblyDefinedSymbols.put(assembly, definedSymbols);
- }
-
- protected void configureReference(int assembly1, int assembly2) {
- this.references.put(assembly1, assembly2);
- this.assemblyreferences.insert(assembly1, assembly2);
- }
-
- protected void configureDestination(int assembly, String destinationPath, String targetVersion, String configuration) {
- if (destinationPath == null) {
- destinationPath = "";
- }
-
- if (targetVersion == null) {
- targetVersion = "";
- }
-
- this.assemblyDestinations.put(assembly, destinationPath);
- this.assemblyTargetVersions.put(assembly, targetVersion);
- this.assemblyConfigurations.put(assembly, configuration);
- }
-
- protected void configureFile(FileEntry file, int assembly, CodeModel codeModel, boolean checked) {
- for (FileEntry f = file; !f.isRootDirectory() && !new File(f.getPathString()).isDirectory(); f = f.getParentDirectory()) {
- this.fileCodeModels.put(f.getID(), this.getCodeModelID(codeModel));
- }
-
- this.fileCodeModels.put(file.getID(), this.getCodeModelID(codeModel));
- this.fileassemblys.put(file.getID(), assembly);
- if (checked) {
- this.registeredcheckedfiles.put(file);
- }
-
- this.registeredsolutionfiles.put(file);
- }
-
- protected void configureResourceFile(FileEntry file, int assembly, String packageName) {
- this.fileassemblys.put(file.getID(), assembly);
- if (packageName != null) {
- this.resourcepackagenames.put(file.getID(), packageName);
- }
-
- this.registeredresourcefiles.put(file);
- }
-
- protected void configure() {
- this.fileassemblys.clear();
- this.references.clear();
- this.assemblyreferences.clear();
- this.registeredcheckedfiles.clear();
- this.registeredsolutionfiles.clear();
- this.registeredresourcefiles.clear();
- this.checkedfiles.clear();
- this.solutionfiles.clear();
- this.assemblyProjectFilePaths.clear();
- this.assemblyRootNamespaces.clear();
- this.assemblyTagLibs.clear();
- this.assemblyDefaultImports.clear();
- this.assemblyDefinedSymbols.clear();
- this.assemblyDestinations.clear();
- this.assemblyConfigurations.clear();
- this.assemblyTargetVersions.clear();
- this.resourcepackagenames.clear();
- this.myCodeModelFilePatterns.clear();
- this.synchronize();
- }
-
- public List getAssemblyTagLibPaths(int assembly) {
- return this.assemblyTagLibs.get(assembly);
- }
-
- public FileEntry getAssemblyHome(int assembly) {
- return this.getEntry(this.assemblyProjectFilePaths.get(assembly)).getParentDirectory();
- }
-
- public String getAssemblyNameString(int assembly) {
- return this.assemblyProjectFilePaths.get(assembly);
- }
-
- public String getTargetVersion(FileEntry file) {
- return this.assemblyTargetVersions.containsKey(this.getAssembly(file)) ? this.assemblyTargetVersions.get(this.getAssembly(file)) : "";
- }
-
- public boolean isExternallyBuilded(FileEntry file) {
- return !this.getConfiguration(file).equals("Extern");
- }
-
- public boolean isDebugBuilded(FileEntry file) {
- return this.getConfiguration(file).equals("Debug");
- }
-
- private String getConfiguration(FileEntry file) {
- return this.assemblyConfigurations.containsKey(this.getAssembly(file)) ? this.assemblyConfigurations.get(this.getAssembly(file)) : "";
- }
-
- public Set getDestinationPaths(FileEntry file) {
- return this.assemblyDestinations.containsKey(this.getAssembly(file))
- ? Collections.singleton(this.assemblyDestinations.get(this.getAssembly(file)))
- : Collections.EMPTY_SET;
- }
-
- protected boolean hasHigherPriority(FileEntry file, FileEntry referedFile1, FileEntry referedFile2) {
- int assembly1 = this.fileassemblys.get(referedFile1.getID());
- int assembly2 = this.fileassemblys.get(referedFile2.getID());
- int assembly = this.fileassemblys.get(file.getID());
- this.assemblyreferences.DEFAULT_ITERATOR.init(assembly);
-
- while (this.assemblyreferences.DEFAULT_ITERATOR.hasMoreElements()) {
- int referedassembly = this.assemblyreferences.DEFAULT_ITERATOR.nextValue();
- if (referedassembly == assembly1) {
- return true;
- }
-
- if (referedassembly == assembly2) {
- return false;
- }
- }
-
- return false;
- }
-
- protected boolean isReferableFrom(FileEntry file, FileEntry referingFile) {
- this.pack();
- return this.references.contains(this.fileassemblys.get(referingFile.getID()), this.fileassemblys.get(file.getID()));
- }
-
- protected boolean isReferableFrom(int assembly, int referingAssembly) {
- this.pack();
- return this.references.contains(referingAssembly, assembly);
- }
-
- private void pack() {
- if (!this.packed) {
- this.packed = true;
- this.registeredcheckedfiles.DEFAULT_ITERATOR.init();
-
- while (this.registeredcheckedfiles.DEFAULT_ITERATOR.hasMoreElements()) {
- FileEntry file = this.registeredcheckedfiles.DEFAULT_ITERATOR.nextKey();
- this.pack(file, this.fileassemblys.get(file.getID()), this.fileCodeModels.get(file.getID()), this.checkedfiles);
- }
-
- this.registeredsolutionfiles.DEFAULT_ITERATOR.init();
-
- while (this.registeredsolutionfiles.DEFAULT_ITERATOR.hasMoreElements()) {
- FileEntry file = this.registeredsolutionfiles.DEFAULT_ITERATOR.nextKey();
- this.pack(file, this.fileassemblys.get(file.getID()), this.fileCodeModels.get(file.getID()), this.solutionfiles);
- }
- }
- }
-
- private void pack(FileEntry file, int assembly, int lang, SetOfFileEntry files) {
- if (file.isDirectory()) {
- int count = file.getChildCount();
-
- for (int i = 0; i < count; ++i) {
- FileEntry child = file.getChildEntry(i);
- this.pack(child, assembly, lang, files);
- }
- } else {
- this.fileassemblys.put(file.getID(), assembly);
- this.fileCodeModels.put(file.getID(), lang);
- files.put(file);
- }
- }
-
- public String getResourcePackageName(FileEntry file) {
- return this.resourcepackagenames.containsKey(file.getID()) ? this.resourcepackagenames.get(file.getID()) : "";
- }
-
- public CodeModel getCodeModel(FileEntry file){
- if (this.fileCodeModels.contains(file.getID())) {
- return this.getCodeModel(this.fileCodeModels.get(file.getID()));
- } else {
- this.pack();
- return this.getCodeModel(this.fileCodeModels.get(file.getID()));
- }
- }
-
- protected boolean isCheckedSolutionFile(FileEntry file) {
- this.pack();
- return this.checkedfiles.contains(file);
- }
-
- protected boolean isSolutionFile(FileEntry file) {
- this.pack();
- return this.solutionfiles.contains(file);
- }
-
- public SetOfFileEntry getCheckedSolutionFiles() {
- this.pack();
- return this.checkedfiles;
- }
-
- public SetOfFileEntry getSolutionFiles() {
- this.pack();
- return this.solutionfiles;
- }
-
- public SetOfFileEntry getResourceFiles() {
- this.pack();
- return this.registeredresourcefiles;
- }
-
- public int getID(FileEntry file) {
- return file == null ? -1 : file.getID();
- }
-
- public FileEntry getFileEntry(int id) {
- return id == -1 ? null : this.entries[id];
- }
-
- public boolean checkSynchronized() throws InterruptedException {
- for (int i = 0; i < this.entryCount; ++i) {
- FileEntry entry = this.entries[i];
- if (!entry.isSynchronized() && entry.getCodeModel() != null) {
- return false;
- }
-
- if (this.stopcallback.stopAsyncSynchronize()) {
- throw new InterruptedException();
- }
- }
-
- return true;
- }
-
- public FileEntry getRootDirectory() {
- return this.entries[0];
- }
-
- public FileEntry getEntry(String path) {
- while (path.endsWith(File.separator)) {
- path = path.substring(0, path.length() - 1);
- }
-
- while (path.startsWith(File.separator)) {
- path = path.substring(1);
- }
-
- FileEntry entry = this.getRootDirectory();
- int oldpos = 0;
-
- for (int pos = path.indexOf(File.separatorChar, oldpos); pos != -1; pos = path.indexOf(File.separatorChar, oldpos)) {
- String name = path.substring(oldpos, pos);
- if (!name.equals(".")) {
- if (name.equals("..") && this.getRootDirectory() != entry) {
- entry = entry.getParentDirectory();
- } else {
- entry = entry.getEntry(name);
- }
- }
-
- oldpos = pos + 1;
-
- while (path.charAt(oldpos) == File.separatorChar) {
- ++oldpos;
- }
- }
-
- return entry.getEntry(path.substring(oldpos));
- }
-
- protected String getEncoding() {
- return this.encoding;
- }
-
- protected int declareEntry(FileEntry e) {
- if (this.entryCount >= this.entries.length) {
- FileEntry[] entities = new FileEntry[this.entries.length * 2 + 1];
- System.arraycopy(this.entries, 0, entities, 0, this.entries.length);
- this.entries = entities;
- }
-
- this.entries[this.entryCount] = e;
- return this.entryCount++;
- }
-
- protected void fileIncluded(FileEntry entry) {
- if (this.currentIncludeFile != null && this.currentIncludeFile != entry) {
- this.includedEntryVersions.put(entry.getID(), entry.getVersion());
- this.includes.insert(this.currentIncludeFile.getID(), entry.getID());
- }
- }
-
- protected long getSyntaxVersion(FileEntry entry) {
- if (entry.getCodeModel() != null && entry.getCodeModel().getPreprocessor() != null) {
- if (!this.includes.contains(entry.getID())) {
- this.includes.put(entry.getID(), entry.getID());
- this.includedEntryVersions.put(entry.getID(), entry.getVersion());
- this.currentIncludeFile = entry;
- entry.getCodeModel().getPreprocessor().processVersion(entry);
- this.currentIncludeFile = null;
- }
-
- long version = 0L;
- this.includes.DEFAULT_ITERATOR.init(entry.getID());
-
- while (this.includes.DEFAULT_ITERATOR.hasMoreElements()) {
- FileEntry includedFile = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextValue());
- version = version * 37L ^ includedFile.getVersion();
- }
-
- return version;
- } else {
- return entry.getVersion();
- }
- }
-
- protected void createSyntaxTree(
- FileEntry file, SyntaxTree ast, boolean errors, boolean parseCode, boolean parseComments, String completionStr, int completionLine, int completionColumn
- ) {
- try {
- ast.clear();
- Reader reader = file.getPreProcessedReader(ast);
- if (completionStr != null) {
- this.completionReader.init(reader, completionStr, completionLine, completionColumn);
- reader = this.completionReader;
- }
-
- ast.declareFile(file);
- ast.declareSyntax(file.getLanguage().getSyntax());
- ast.declareVersion(file.getSyntaxVersion());
- ast.declareContainsComments(parseComments);
- ast.declareContainsCode(parseCode);
- ParserAbstraction parser = file.getLanguage().getParser();
- if (parser != null) {
- parser.fillSyntaxTree(reader, file, file.getSyntaxVersion(), errors, ast, parseCode, parseComments);
- } else {
- int rootnode = ast.declareNode(0, true, new int[0], 0, 0, 1, 1);
- ast.declareContent(this.identifiers, null, rootnode);
- }
-
- reader.close();
- } catch (IOException ignored) {
- }
- }
-
- protected Reader createBomReader(InputStream inStream, String fallbackEncoding) throws IOException {
- return myFileReaderCallback.createBomReader(inStream,fallbackEncoding);
- }
-
- protected Reader createLineEndingNormalizedReader(Reader reader) {
- return new LineEndingNormalizedReader(reader);
- }
-
- private static class CompletionReader extends Reader {
- private int completionLine;
- private int completionColumn;
- private String str;
- private int line;
- private int column;
- private int pos;
- private int maxpos;
- private Reader reader;
- private char[] buffer = new char[10000];
-
- public CompletionReader(Reader reader, String str, int completionLine, int completionColumn) {
- this.init(reader, str, completionLine, completionColumn);
- }
-
- public CompletionReader() {
- }
-
- public void init(Reader reader, String str, int completionLine, int completionColumn) {
- this.str = str;
- this.completionLine = completionLine;
- this.completionColumn = completionColumn;
- this.reader = reader;
- this.line = this.column = 1;
- this.pos = 0;
- this.maxpos = 0;
- }
-
- @Override
- public int read(char[] cbuf, int off, int len) throws IOException {
- if (this.pos >= this.maxpos) {
- this.maxpos = this.reader.read(this.buffer);
- if (this.maxpos == -1) {
- return -1;
- }
-
- this.pos = 0;
- }
-
- int count = 0;
-
- while (this.pos < this.maxpos && count < len) {
- if (this.line == this.completionLine && this.column == this.completionColumn) {
- if (count + this.str.length() >= len) {
- return count;
- }
-
- count += this.str.length();
-
- for (int i = 0; i < this.str.length(); ++i) {
- cbuf[off++] = this.str.charAt(i);
- }
- }
-
- char c = this.buffer[this.pos++];
- switch (c) {
- case '\n':
- cbuf[off++] = c;
- ++count;
- ++this.line;
- this.column = 1;
- break;
- case '\uFFEE':
- if (this.pos < this.maxpos - 8 && count < len - 8) {
- cbuf[off++] = c;
- count += 9;
- this.line = 0;
- this.column = 0;
- this.line |= (cbuf[off++] = this.buffer[this.pos++]) << 24;
- this.line |= (cbuf[off++] = this.buffer[this.pos++]) << 16;
- this.line |= (cbuf[off++] = this.buffer[this.pos++]) << '\b';
- this.line |= (cbuf[off++] = this.buffer[this.pos++]);
- this.column |= (cbuf[off++] = this.buffer[this.pos++]) << 24;
- this.column |= (cbuf[off++] = this.buffer[this.pos++]) << 16;
- this.column |= (cbuf[off++] = this.buffer[this.pos++]) << '\b';
- this.column |= (cbuf[off++] = this.buffer[this.pos++]);
- break;
- }
- default:
- cbuf[off++] = c;
- ++count;
- ++this.column;
- }
- }
-
- return count;
- }
-
- @Override
- public void close() throws IOException {
- this.reader.close();
- }
- }
-
- private static class LineEndingNormalizedReader extends Reader {
- private Reader reader;
- private boolean rseen;
-
- public LineEndingNormalizedReader(Reader reader) {
- this.reader = reader;
- this.rseen = false;
- }
-
- @Override
- public int read(char[] cbuf, int off, int len) throws IOException {
- int readlen = this.reader.read(cbuf, off, len);
- if (readlen == -1) {
- return -1;
- } else {
- boolean rseen = this.rseen;
- int destoff = off;
- int srcoff = off;
- int maxoff = off + readlen;
-
- while (srcoff < maxoff) {
- char c = cbuf[srcoff++];
- switch (c) {
- case '\n':
- if (!rseen) {
- cbuf[destoff++] = '\n';
- }
-
- rseen = false;
- break;
- case '\r':
- cbuf[destoff++] = '\n';
- rseen = true;
- break;
- default:
- cbuf[destoff++] = c;
- rseen = false;
- }
- }
-
- this.rseen = rseen;
- return destoff - off;
- }
- }
-
- @Override
- public void close() throws IOException {
- this.reader.close();
- this.reader = null;
- }
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParameterType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParameterType.java
deleted file mode 100644
index eee3838..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParameterType.java
+++ /dev/null
@@ -1,226 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.collections.ListOf;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class MethodParameterType extends Type {
- private int id;
- private final EntitySpace space;
- private final IdentifierSpace identifiers;
- private final FileSpace filespace;
- private FileEntry file;
- private int declarationNumber;
- private int line;
- private int startcolumn;
- private int endcolumn;
- private int identifier;
- private Member method;
- private int number;
- private ListOf boundtypes;
- private boolean typesloaded;
-
- protected MethodParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace) {
- super(filespace,space, 16);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- }
-
- protected MethodParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace, FileEntry file, int declarationNumber) {
- super(filespace,space, 16);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- this.id = space.declareEntity(this);
- this.file = file;
- this.declarationNumber = declarationNumber;
- this.boundtypes = null;
- this.typesloaded = false;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.line = stream.readInt();
- this.startcolumn = stream.readInt();
- this.endcolumn = stream.readInt();
- this.id = stream.readInt();
- this.file = this.filespace.getFileEntry(stream.readInt());
- this.declarationNumber = stream.readInt();
- this.identifier = stream.readInt();
- this.method = (Member)this.space.getEntity(stream.readInt());
- this.number = stream.readInt();
- this.typesloaded = stream.readBoolean();
- if (stream.readBoolean()) {
- this.boundtypes = new ListOf<>(this.space, stream);
- }
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.line);
- stream.writeInt(this.startcolumn);
- stream.writeInt(this.endcolumn);
- stream.writeInt(this.id);
- stream.writeInt(this.file.getID());
- stream.writeInt(this.declarationNumber);
- stream.writeInt(this.identifier);
- stream.writeInt(this.space.getID(this.method));
- stream.writeInt(this.number);
- stream.writeBoolean(this.typesloaded);
- stream.writeBoolean(this.boundtypes != null);
- if (this.boundtypes != null) {
- this.boundtypes.store(stream);
- }
- }
-
- protected void invalidate() {
- if (this.boundtypes != null) {
- this.boundtypes.clear();
- }
-
- this.typesloaded = false;
- }
-
- protected void declareBoundtype(Type boundtype) {
- this.boundtypes.add(boundtype);
- this.typesloaded = true;
- }
-
- protected void declarePositions(int line, int startcolumn, int endcolumn) {
- this.line = line;
- this.startcolumn = startcolumn;
- this.endcolumn = endcolumn;
- }
-
- protected void declareSyntax(int identifier, Member method, int number) {
- this.identifier = identifier;
- this.method = method;
- this.number = number;
- if (this.boundtypes == null) {
- this.boundtypes = new ListOf<>(this.space);
- } else {
- this.boundtypes.clear();
- }
- }
-
- @Override
- public int getIdentifierLine() {
- this.space.loadPositions(this.file);
- return this.line;
- }
-
- @Override
- public int getIdentifierEndColumn() {
- this.space.loadPositions(this.file);
- return this.endcolumn;
- }
-
- @Override
- public int getIdentifierStartColumn() {
- this.space.loadPositions(this.file);
- return this.startcolumn;
- }
-
- public Member getMethod() {
- return this.method;
- }
-
- public int getNumber() {
- return this.number;
- }
-
- @Override
- public FileEntry getFile() {
- return this.file;
- }
-
- @Override
- public int getDeclarationNumber() {
- return this.declarationNumber;
- }
-
- public int getBoundTypeCount() {
- this.loadBounds();
- return this.boundtypes != null && this.boundtypes.size() != 0 ? this.boundtypes.size() : 1;
- }
-
- public Type getBoundType(Type type, int number) throws UnknownEntityException {
- Type membertype = this.getBoundType(number);
- if (type.isClassType()) {
- Type containingtype = ((ClassType)type).getContainingTypeOfMember(this.method);
- return containingtype.isParameterizedType() ? ((ParameterizedType)containingtype).replaceType(membertype) : membertype;
- } else {
- Type containingtype = ((ParameterizedType)type).getClassType().getContainingTypeOfMember(this.method);
- return !containingtype.isParameterizedType()
- ? ((ParameterizedType)type).replaceType(membertype)
- : ((ParameterizedType)type).replaceType(((ParameterizedType)containingtype).replaceType(membertype));
- }
- }
-
- public Type getBoundType(int number) throws UnknownEntityException {
- this.loadBounds();
- return (Type)(this.boundtypes != null && this.boundtypes.size() > 0 ? this.boundtypes.get(number) : this.space.getRootClasstype(this.file));
- }
-
- @Override
- public Type getErasedType() throws UnknownEntityException {
- this.loadBounds();
- return (Type)(this.boundtypes != null && this.boundtypes.size() > 0 ? this.boundtypes.get(0) : this.space.getRootClasstype(this.file));
- }
-
- @Override
- public ClassType getEnclosingClassType() {
- return this.method.getEnclosingClassType();
- }
-
- @Override
- public ClassType getEnclosingTopLevelClassType() {
- return this.method.getEnclosingClassType().getEnclosingTopLevelClassType();
- }
-
- @Override
- public int getIdentifier() {
- return this.identifier;
- }
-
- @Override
- public int getID() {
- return this.id;
- }
-
- private void loadBounds() {
- if (!this.typesloaded) {
- this.typesloaded = true;
- if (getLanguage().getTypeSystem().inheritsBoundTypes() && this.method.getOverriddenMembers().size() > 0) {
- try {
- Member omethod = this.method.getOverriddenMembers().get();
- int count = omethod.getMethodParametertypeCount();
-
- for(int number = 0; number < count; ++number) {
- MethodParameterType omethodparametertype = omethod.getMethodParametertype(number);
- int identifier = omethodparametertype.getIdentifier();
- MethodParameterType methodparametertype = this.method.accessParametertype(identifier);
- int boundcount = omethodparametertype.getBoundTypeCount();
-
- for(int j = 0; j < boundcount; ++j) {
- Type boundtype = omethodparametertype.getBoundType(this.method.getEnclosingClassType().parameterizeCanonical(), j);
- this.space.declareBoundtype(methodparametertype, boundtype);
- }
- }
- } catch (UnknownEntityException ignored) {
- }
- } else {
- this.space.loadTypes(this.file);
- }
- }
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParametertypeVariable.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParametertypeVariable.java
deleted file mode 100644
index b401d69..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/MethodParametertypeVariable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class MethodParametertypeVariable extends Type {
- private EntitySpace space;
- private int entity;
- private MethodParameterType methodparametertype;
-
- protected MethodParametertypeVariable(FileSpace fileSpace, EntitySpace space) {
- super(fileSpace, space, 16);
- this.space = space;
- }
-
- protected MethodParametertypeVariable(FileSpace fileSpace, EntitySpace space, MethodParameterType methodparametertype) {
- super(fileSpace, space, 16);
- this.space = space;
- this.entity = space.declareEntity(this);
- this.methodparametertype = methodparametertype;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.entity = stream.readInt();
- this.methodparametertype = (MethodParameterType) this.space.getEntity(stream.readInt());
- }
-
- @Override
- public int getID() {
- return this.entity;
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.entity);
- stream.writeInt(this.space.getID(this.methodparametertype));
- }
-
- @Override
- public Language getLanguage() {
- return this.getMethodparametertype().getLanguage();
- }
-
- public MethodParameterType getMethodparametertype() {
- return this.methodparametertype;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Model.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/Model.java
deleted file mode 100644
index 18de046..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Model.java
+++ /dev/null
@@ -1,211 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.callback.APISearcherCallback;
-import com.apkide.analysis.api.clm.callback.CodeCompleterCallback;
-import com.apkide.analysis.api.clm.callback.FileReaderCallback;
-import com.apkide.analysis.api.clm.callback.HighlighterCallback;
-import com.apkide.analysis.api.clm.callback.OpenFileCallback;
-import com.apkide.analysis.api.clm.callback.RefactoringCallback;
-import com.apkide.analysis.api.clm.callback.StopCallback;
-import com.apkide.analysis.api.clm.callback.StructureCallback;
-import com.apkide.analysis.api.clm.callback.SymbolSearcherCallback;
-import com.apkide.analysis.api.clm.callback.UsageSearcherCallback;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-import java.util.List;
-
-public class Model {
- private static int modelCount = 0;
- public final StructureCallback structurecallback;
- public final HighlighterCallback highlightercallback;
- public final SymbolSearcherCallback symbolcallback;
- public final CodeCompleterCallback completercallback;
- public final RefactoringCallback refactorcallback;
- public final UsageSearcherCallback usagesearchercallback;
- public final APISearcherCallback apisearchercallback;
- public final StopCallback stopcallback;
- public final OpenFileCallback openfilecallback;
-
- public final IdentifierSpace identifiers;
- public final FileSpace filespace;
- public final SyntaxTreeSpace trees;
- public final EntitySpace space;
- public final Compiler compiler;
- public ErrorTable errortable;
- private CodingStyle codingstyle;
- private String[] todos;
- private boolean[] todoCaseSensitive;
-
- public Model() {
- this(null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null);
- }
-
- public Model(
- StructureCallback structurecallback,
- HighlighterCallback highlightercallback,
- SymbolSearcherCallback symbolcallback,
- CodeCompleterCallback completercallback,
- RefactoringCallback refactorcallback,
- UsageSearcherCallback usagesearchercallback,
- APISearcherCallback apisearchercallback,
- StopCallback stopcallback,
- OpenFileCallback openfilecallback,
- FileReaderCallback fileReaderCallback
- ) {
- this.structurecallback = structurecallback;
- this.highlightercallback = highlightercallback;
- this.symbolcallback = symbolcallback;
- this.completercallback = completercallback;
- this.refactorcallback = refactorcallback;
- this.usagesearchercallback = usagesearchercallback;
- this.apisearchercallback = apisearchercallback;
- this.stopcallback = stopcallback;
- this.openfilecallback = openfilecallback;
- ++modelCount;
- this.identifiers = new IdentifierSpace();
- this.filespace = new FileSpace(this.identifiers, openfilecallback, stopcallback,fileReaderCallback);
- this.trees = new SyntaxTreeSpace(this.identifiers, this.filespace);
- this.space = new EntitySpace(this.identifiers, this.filespace, this.trees, stopcallback);
- this.errortable = new ErrorTable(this);
- this.compiler = new Compiler(this);
- }
-
- @Override
- protected void finalize() throws Throwable {
- --modelCount;
- }
-
- public void close() {
- }
-
- protected void load(StoreInputStream stream) throws IOException {
- this.filespace.loadEntries(stream);
- this.space.loadEntries(stream);
- this.identifiers.load(stream);
- this.filespace.load(stream);
- this.space.load(stream);
- this.errortable.load(stream);
- this.compiler.load(stream);
- }
-
- protected void store(StoreOutputStream stream) throws IOException {
- this.filespace.storeEntries(stream);
- this.space.storeEntries(stream);
- this.identifiers.store(stream);
- this.filespace.store(stream);
- this.space.store(stream);
- this.errortable.store(stream);
- this.compiler.store(stream);
- }
-
- public void begin(boolean updateFileSpace) {
- this.filespace.update(updateFileSpace);
- this.trees.update();
- this.space.update();
- this.space.preloadNamespaces();
- this.compiler.update();
- }
-
- public void shrink(boolean full) {
- this.trees.shrink(full);
- this.space.shrink(full);
- if (full) {
- for (CodeModel codeModel : filespace.getCodeModels()) {
- for (Language language : codeModel.getLanguages()) {
- if (language != null)
- language.shrink();
- }
- }
- SyntaxTreePool.shrink();
- }
- }
-
- public void done() {
- this.trees.releaseSyntaxTrees();
- this.filespace.close();
- }
-
- public CodeModel[] getCodeModels(){
- return filespace.getCodeModels();
- }
-
- public void configureCodeModelFilePatterns(CodeModel codeModel,List filePatterns){
- filespace.configureCodeModelFilePatterns(codeModel,filePatterns);
- }
-
- public void configureCodeModels(CodeModel[] codeModels){
- filespace.configureCodeModels(codeModels);
- }
-
- public void reconfigure() {
- this.space.invalidateAll();
- }
-
- public void configure() {
- this.filespace.configure();
- this.space.invalidateNamespaces();
- }
-
- public void configureDestination(int assembly, String destinationPath,
- String targetVersion, String configuration) {
- this.filespace.configureDestination(assembly, destinationPath,
- targetVersion, configuration);
- }
-
- public void configureEncoding(String encoding) {
- this.filespace.configureEncoding(encoding);
- }
-
- public void configureAssembly(
- int assembly, String projectFilePath, String rootNamespace,
- List defaultImports,
- List definedSymbols,
- List tagLibPaths) {
- this.filespace.configureAssembly(assembly, projectFilePath, rootNamespace,
- defaultImports, definedSymbols, tagLibPaths);
- }
-
- public void configureReference(int assembly1, int assembly2) {
- this.filespace.configureReference(assembly1, assembly2);
- }
-
- public void configureFile(FileEntry file, int assembly, CodeModel codeModel, boolean checked) {
- this.filespace.configureFile(file, assembly, codeModel, checked);
- }
-
- public void configureResourceFile(FileEntry file, int assembly, String packageName) {
- this.filespace.configureResourceFile(file, assembly, packageName);
- }
-
- public String[] getTodos() {
- return this.todos;
- }
-
- public boolean[] getTodoCasesensitive() {
- return this.todoCaseSensitive;
- }
-
- public CodingStyle getCodingstyle() {
- return this.codingstyle;
- }
-
- public void registerOptions(CodingStyle codingstyle, String[] todos, boolean[] todoCaseSensitive) {
- this.codingstyle = codingstyle;
- this.todos = todos;
- this.todoCaseSensitive = todoCaseSensitive;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Namespace.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/Namespace.java
deleted file mode 100644
index ac95320..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Namespace.java
+++ /dev/null
@@ -1,437 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.collections.MapOfInt;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.SetOfInt;
-
-import java.io.IOException;
-
-public final class Namespace extends Entity {
- private int entity;
- private final EntitySpace space;
- private final IdentifierSpace identifiers;
- private final FileSpace filespace;
- private int identifier;
- private Namespace enclosingNamespace;
- private boolean exists;
- private MapOfInt memberNamespaces;
- private MapOfInt memberClasstypes;
- private SetOfFileEntry memberFiles;
- private SetOfInt assemblies;
- private MapOfInt memberClasstypesCaseInsensitive;
-
- protected Namespace(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace) {
- super(filespace, space);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- }
-
- protected Namespace(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace, int identifier, Namespace enclosingPackage) {
- super(filespace, space);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- this.identifier = identifier;
- this.entity = space.declareEntity(this);
- this.enclosingNamespace = enclosingPackage;
- this.exists = enclosingPackage == null;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.identifier = stream.readInt();
- this.entity = stream.readInt();
- this.enclosingNamespace = (Namespace) this.space.getEntity(stream.readInt());
- this.exists = stream.readBoolean();
- if (stream.readBoolean()) {
- this.memberNamespaces = new MapOfInt<>(this.space, stream);
- }
-
- if (stream.readBoolean()) {
- this.memberClasstypes = new MapOfInt<>(this.space, stream);
- }
-
- if (stream.readBoolean()) {
- this.memberFiles = new SetOfFileEntry(this.filespace, stream);
- }
-
- if (stream.readBoolean()) {
- this.assemblies = new SetOfInt(stream);
- }
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.identifier);
- stream.writeInt(this.entity);
- stream.writeInt(this.space.getID(this.enclosingNamespace));
- stream.writeBoolean(this.exists);
- stream.writeBoolean(this.memberNamespaces != null);
- if (this.memberNamespaces != null) {
- this.memberNamespaces.store(stream);
- }
-
- stream.writeBoolean(this.memberClasstypes != null);
- if (this.memberClasstypes != null) {
- this.memberClasstypes.store(stream);
- }
-
- stream.writeBoolean(this.memberFiles != null);
- if (this.memberFiles != null) {
- this.memberFiles.store(stream);
- }
-
- stream.writeBoolean(this.assemblies != null);
- if (this.assemblies != null) {
- this.assemblies.store(stream);
- }
- }
-
- public void invalidate() {
- if (this.memberFiles != null) {
- this.memberFiles.clear();
- }
-
- if (this.memberClasstypes != null) {
- this.memberClasstypes.clear();
- }
-
- if (this.assemblies != null) {
- this.assemblies.clear();
- }
-
- this.exists = false;
- this.memberClasstypesCaseInsensitive = null;
- }
-
- @Override
- public int getIdentifier() {
- return this.identifier;
- }
-
- protected void declareExists(FileEntry file) {
- int assembly = file.getAssembly();
-
- for (Namespace p = this.enclosingNamespace; p != null; p = p.enclosingNamespace) {
- p.exists = true;
- if (p.assemblies == null) {
- p.assemblies = new SetOfInt();
- }
-
- p.assemblies.put(assembly);
- }
-
- if (this.memberFiles == null) {
- this.memberFiles = new SetOfFileEntry(this.filespace);
- }
-
- this.memberFiles.put(file);
- if (this.assemblies == null) {
- this.assemblies = new SetOfInt();
- }
-
- this.assemblies.put(assembly);
- this.exists = true;
- }
-
- protected void declareMemberClasstype(int identifier, ClassType classtype) {
- if (this.memberClasstypes == null) {
- this.memberClasstypes = new MapOfInt<>(this.space);
- }
-
- this.memberClasstypes.insert(identifier, classtype);
- }
-
- public Namespace getMemberNamespace(int identifier) {
- if (this.memberNamespaces == null) {
- this.memberNamespaces = new MapOfInt<>(this.space);
- }
-
- if (!this.memberNamespaces.contains(identifier)) {
- Namespace p = new Namespace(this.space, this.identifiers, this.filespace, identifier, this);
- this.memberNamespaces.put(identifier, p);
- return p;
- } else {
- return this.memberNamespaces.get(identifier);
- }
- }
-
- public Namespace getEnclosingNamespace() {
- return this.enclosingNamespace;
- }
-
-
- @Override
- public Language getLanguage() {
- Language language = findLanguage();
- if (language == null) {
- for (CodeModel codeModel : filespace.getCodeModels()) {
- if (codeModel.getLanguages().size() > 0) {
- return codeModel.getLanguages().get(0);
- }
- }
- return null;
- }
- return language;
- }
-
- private Language findLanguage() {
- this.space.loadNamespaces();
- if (memberFiles != null && memberFiles.size() > 0 && memberFiles.get().getCodeModel() != null && memberFiles.get().getCodeModel().getLanguages().size() > 0) {
- return memberFiles.get().getCodeModel().getLanguages().get(0);
- }
- if (memberNamespaces != null && memberNamespaces.size() > 0) {
- memberNamespaces.DEFAULT_ITERATOR.init();
- while (memberNamespaces.DEFAULT_ITERATOR.hasMoreElements()) {
- Language language = memberNamespaces.get().findLanguage();
- if (language != null) {
- return language;
- }
- }
- }
- return null;
- }
-
- public boolean isRoot() {
- return this.enclosingNamespace == null;
- }
-
- public SetOf getAllMemberNamespaces() {
- this.space.loadNamespaces();
- SetOf pakages = new SetOf<>(this.space);
- if (this.memberNamespaces != null) {
- this.memberNamespaces.DEFAULT_ITERATOR.init();
-
- while (this.memberNamespaces.DEFAULT_ITERATOR.hasMoreElements()) {
- Namespace pakage = (Namespace) this.memberNamespaces.DEFAULT_ITERATOR.nextValue();
- if (pakage.exists) {
- pakages.put(pakage);
- }
- }
- }
-
- return pakages;
- }
-
- public SetOf getAllMemberClasstypes() {
- this.space.loadNamespaces();
- SetOf types = new SetOf<>(this.space);
- if (this.memberClasstypes != null) {
- this.memberClasstypes.DEFAULT_ITERATOR.init();
-
- while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType) this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
- types.put(classtype);
- }
- }
-
- return types;
- }
-
- public SetOfFileEntry getAllMemberFiles() {
- this.space.loadNamespaces();
- return this.memberFiles == null ? new SetOfFileEntry(this.filespace) : this.memberFiles;
- }
-
- public SetOf getAllPartialClasstypes(FileEntry file, int identifier) {
- this.space.loadNamespaces();
- SetOf types = null;
- if (this.memberClasstypes != null) {
- this.memberClasstypes.DEFAULT_ITERATOR.init(identifier);
-
- while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType) this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
- if (classtype.isPartial() && classtype.isReferable(file)) {
- if (types == null) {
- types = new SetOf<>(this.space);
- }
-
- types.put(classtype);
- }
- }
- }
-
- return types;
- }
-
- public SetOfInt getAllAssemblies() {
- return this.assemblies == null ? new SetOfInt() : this.assemblies;
- }
-
- public Entity accessMember(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) throws UnknownEntityException {
- this.space.loadNamespaces();
- ClassType type = this.tryAccessMemberClasstype(file, identifier, caseSensitive, parameterTypeCount, referingPackage);
- return (Entity) (type != null ? type : this.accessMemberNamespace(file, identifier, caseSensitive));
- }
-
- public ClassType accessMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) throws UnknownEntityException {
- this.space.loadNamespaces();
- ClassType type = this.tryAccessMemberClasstype(file, identifier, caseSensitive, parameterTypeCount, referingPackage);
- if (type != null) {
- return type;
- } else {
- throw new UnknownEntityException();
- }
- }
-
- private ClassType tryAccessMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) {
- if (this.memberClasstypes == null) {
- return null;
- } else {
- int lookupIdentifier = identifier;
- MapOfInt lookupTypes = this.memberClasstypes;
- if (!caseSensitive) {
- if (this.memberClasstypesCaseInsensitive == null) {
- this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
- this.memberClasstypes.DEFAULT_ITERATOR.init();
-
- while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType) this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
- this.memberClasstypesCaseInsensitive.insert(ident, type);
- }
- }
-
- lookupIdentifier = this.identifiers.toUpperCase(identifier);
- lookupTypes = this.memberClasstypesCaseInsensitive;
- }
-
- ClassType foundtype = null;
- if (lookupTypes.contains(lookupIdentifier)) {
- lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
-
- while (lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType type = (ClassType) lookupTypes.DEFAULT_ITERATOR.nextValue();
- if (type.isApplicable(file, parameterTypeCount) && type.isVisible(referingPackage) && type.isReferable(file)) {
- if (foundtype == null) {
- foundtype = type;
- } else if (!this.filespace.hasHigherPriority(file, foundtype.getFile(), type.getFile())
- && this.filespace.hasHigherPriority(file, type.getFile(), foundtype.getFile())) {
- foundtype = type;
- }
- }
- }
- }
-
- return foundtype;
- }
- }
-
- public boolean existsMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) {
- this.space.loadNamespaces();
- if (this.memberClasstypes == null) {
- return false;
- } else {
- int lookupIdentifier = identifier;
- MapOfInt lookupTypes = this.memberClasstypes;
- if (!caseSensitive) {
- if (this.memberClasstypesCaseInsensitive == null) {
- this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
- this.memberClasstypes.DEFAULT_ITERATOR.init();
-
- while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType) this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
- this.memberClasstypesCaseInsensitive.insert(ident, type);
- }
- }
-
- lookupIdentifier = this.identifiers.toUpperCase(identifier);
- lookupTypes = this.memberClasstypesCaseInsensitive;
- }
-
- if (lookupTypes.contains(lookupIdentifier)) {
- lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
-
- while (lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType type = (ClassType) lookupTypes.DEFAULT_ITERATOR.nextValue();
- if (type.isApplicable(file, parameterTypeCount) && type.isVisible(referingPackage) && type.isReferable(file)) {
- return true;
- }
- }
- }
-
- return false;
- }
- }
-
- public boolean existsMemberClasstype(int identifier, boolean caseSensitive) {
- this.space.loadNamespaces();
- if (this.memberClasstypes == null) {
- return false;
- } else {
- int lookupIdentifier = identifier;
- MapOfInt lookupTypes = this.memberClasstypes;
- if (!caseSensitive) {
- if (this.memberClasstypesCaseInsensitive == null) {
- this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
- this.memberClasstypes.DEFAULT_ITERATOR.init();
-
- while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
- this.memberClasstypesCaseInsensitive.insert(ident, type);
- }
- }
-
- lookupIdentifier = this.identifiers.toUpperCase(identifier);
- lookupTypes = this.memberClasstypesCaseInsensitive;
- }
-
- return lookupTypes.contains(lookupIdentifier);
- }
- }
-
- public boolean existsMemberNamespace(FileEntry file, int identifier, boolean caseSensitive) {
- this.space.loadNamespaces();
- Namespace memberPakage = this.getMemberNamespace(identifier);
- if (memberPakage.exists) {
- SetOfInt assemblies = memberPakage.getAllAssemblies();
- assemblies.DEFAULT_ITERATOR.init();
-
- while (assemblies.DEFAULT_ITERATOR.hasMoreElements()) {
- int assembly = assemblies.DEFAULT_ITERATOR.nextKey();
- if (this.filespace.isReferableFrom(assembly, file.getAssembly())) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public Namespace accessMemberNamespace(FileEntry file, int identifier, boolean caseSensitive) throws UnknownEntityException {
- this.space.loadNamespaces();
- Namespace memberPakage = this.getMemberNamespace(identifier);
- if (memberPakage.exists) {
- SetOfInt assemblies = memberPakage.getAllAssemblies();
- assemblies.DEFAULT_ITERATOR.init();
-
- while (assemblies.DEFAULT_ITERATOR.hasMoreElements()) {
- int assembly = assemblies.DEFAULT_ITERATOR.nextKey();
- if (this.filespace.isReferableFrom(assembly, file.getAssembly())) {
- return memberPakage;
- }
- }
- }
-
- throw new UnknownEntityException();
- }
-
- @Override
- public int getID() {
- return this.entity;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterType.java
deleted file mode 100644
index cb04a48..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterType.java
+++ /dev/null
@@ -1,214 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.collections.ListOf;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class ParameterType extends Type {
- private int id;
- private final EntitySpace space;
- private final IdentifierSpace identifiers;
- private final FileSpace filespace;
- private FileEntry file;
- private int declarationNumber;
- private int line;
- private int startcolumn;
- private int endcolumn;
- private boolean boundsloaded;
- private ListOf boundtypes;
- private int identifier;
- private int number;
- private ClassType classtype;
-
- protected ParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace) {
- super(filespace,space, 16);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- }
-
- protected ParameterType(EntitySpace space, IdentifierSpace identifiers,
- FileSpace filespace, FileEntry file, int declarationNumber) {
- super(filespace,space, 16);
- this.space = space;
- this.identifiers = identifiers;
- this.filespace = filespace;
- this.id = space.declareEntity(this);
- this.file = file;
- this.declarationNumber = declarationNumber;
- this.boundsloaded = false;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.line = stream.readInt();
- this.startcolumn = stream.readInt();
- this.endcolumn = stream.readInt();
- this.id = stream.readInt();
- this.file = this.filespace.getFileEntry(stream.readInt());
- this.declarationNumber = stream.readInt();
- this.number = stream.readInt();
- this.identifier = stream.readInt();
- this.classtype = (ClassType)this.space.getEntity(stream.readInt());
- this.boundsloaded = stream.readBoolean();
- if (stream.readBoolean()) {
- this.boundtypes = new ListOf<>(this.space, stream);
- }
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.line);
- stream.writeInt(this.startcolumn);
- stream.writeInt(this.endcolumn);
- stream.writeInt(this.id);
- stream.writeInt(this.file.getID());
- stream.writeInt(this.declarationNumber);
- stream.writeInt(this.number);
- stream.writeInt(this.identifier);
- stream.writeInt(this.space.getID(this.classtype));
- stream.writeBoolean(this.boundsloaded);
- stream.writeBoolean(this.boundtypes != null);
- if (this.boundtypes != null) {
- this.boundtypes.store(stream);
- }
- }
-
- protected void invalidate() {
- if (this.boundtypes != null) {
- this.boundtypes.clear();
- }
-
- this.boundsloaded = false;
- }
-
- protected void declarePositions(int line, int startcolumn, int endcolumn) {
- this.line = line;
- this.startcolumn = startcolumn;
- this.endcolumn = endcolumn;
- }
-
- protected void declareSyntax(int identifier, ClassType classtype, int number) {
- this.number = number;
- this.identifier = identifier;
- this.classtype = classtype;
- if (this.boundtypes == null) {
- this.boundtypes = new ListOf<>(this.space);
- } else {
- this.boundtypes.clear();
- }
- }
-
- protected void declareBoundtype(Type boundtype) {
- this.boundtypes.add(boundtype);
- this.boundsloaded = true;
- }
-
- @Override
- public FileEntry getFile() {
- return this.file;
- }
-
- @Override
- public int getDeclarationNumber() {
- return this.declarationNumber;
- }
-
- @Override
- public ClassType getEnclosingClassType() {
- return this.classtype;
- }
-
- @Override
- public ClassType getEnclosingTopLevelClassType() {
- return this.classtype.getEnclosingTopLevelClassType();
- }
-
- @Override
- public int getIdentifierLine() {
- this.space.loadPositions(this.file);
- return this.line;
- }
-
- @Override
- public int getIdentifierEndColumn() {
- this.space.loadPositions(this.file);
- return this.endcolumn;
- }
-
- @Override
- public int getIdentifierStartColumn() {
- this.space.loadPositions(this.file);
- return this.startcolumn;
- }
-
- public int getBoundTypeCount() {
- this.loadBounds();
- return this.boundtypes != null && this.boundtypes.size() != 0 ?
- this.boundtypes.size() : 1;
- }
-
- public int getNumber() {
- return this.number;
- }
-
- public int getAbsoluteNumber() {
- return this.classtype.getAbsoluteParametertypeCount() -
- this.classtype.getParametertypeCount() + this.getNumber();
- }
-
- public Type getBoundType(int number) throws UnknownEntityException {
- this.loadBounds();
- return this.boundtypes != null && this.boundtypes.size() > 0 ?
- this.boundtypes.get(number) :
- this.space.getRootClasstype(this.file,getLanguage());
- }
-
- @Override
- public Type getErasedType() throws UnknownEntityException {
- this.loadBounds();
- return this.boundtypes != null && this.boundtypes.size() > 0 ?
- this.boundtypes.get(0) :
- this.space.getRootClasstype(this.file,getLanguage());
- }
-
- public ClassType getClasstype() {
- return this.classtype;
- }
-
- @Override
- public int getIdentifier() {
- return this.identifier;
- }
-
- @Override
- public int getID() {
- return this.id;
- }
-
- private void loadBoundtypes() {
- if (!this.boundsloaded) {
- this.boundsloaded = true;
- if (this.boundtypes != null) {
- this.space.loadBoundTypes(this.file, this.classtype);
- }
- }
- }
-
- private void loadBounds() {
- if (!this.boundsloaded) {
- this.classtype.getAllSuperTypes();
- if (this.classtype.areSuperClasstypesLoaded()) {
- this.loadBoundtypes();
- }
- }
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterizedType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterizedType.java
deleted file mode 100644
index 766af0c..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ParameterizedType.java
+++ /dev/null
@@ -1,317 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.excpetions.AmbiguousEntityException;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class ParameterizedType extends Type {
- private EntitySpace space;
- private int id;
- private ClassType classtype;
- private Type[] absoluteargumenttypes;
- private int[] absoluteargumentvariances;
- private SetOf allSuperTypes;
-
- protected ParameterizedType(FileSpace fileSpace, EntitySpace space) {
- super(fileSpace,space, 16);
- this.space = space;
- }
-
- protected ParameterizedType(FileSpace fileSpace, EntitySpace space, ClassType classtype, Type[] absoluteargumenttypes, int[] absoluteargumentvariances) {
- super(fileSpace,space, 16);
- this.space = space;
- this.id = space.declareEntity(this);
- this.classtype = classtype;
- this.absoluteargumenttypes = absoluteargumenttypes;
- this.absoluteargumentvariances = absoluteargumentvariances;
- this.allSuperTypes = null;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.id = stream.readInt();
- this.classtype = (ClassType)this.space.getEntity(stream.readInt());
- int count = stream.readInt();
- this.absoluteargumenttypes = new Type[count];
- this.absoluteargumentvariances = new int[count];
-
- for(int i = 0; i < this.absoluteargumenttypes.length; ++i) {
- this.absoluteargumenttypes[i] = (Type)this.space.getEntity(stream.readInt());
- this.absoluteargumentvariances[i] = stream.readInt();
- }
-
- if (stream.readBoolean()) {
- this.allSuperTypes = new SetOf<>(this.space, stream);
- }
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.id);
- stream.writeInt(this.space.getID(this.classtype));
- stream.writeInt(this.absoluteargumenttypes.length);
-
- for(int i = 0; i < this.absoluteargumenttypes.length; ++i) {
- stream.writeInt(this.space.getID(this.absoluteargumenttypes[i]));
- stream.writeInt(this.absoluteargumentvariances[i]);
- }
-
- stream.writeBoolean(this.allSuperTypes != null);
- if (this.allSuperTypes != null) {
- this.allSuperTypes.store(stream);
- }
- }
-
- public void invalidate() {
- this.allSuperTypes = null;
- }
-
- public Type[] getAbsoluteArgumentTypes() {
- return this.absoluteargumenttypes;
- }
-
- public int[] getAbsoluteArgumentVariances() {
- return this.absoluteargumentvariances;
- }
-
- @Override
- public boolean isInterfaceType() {
- return this.getClassType().isInterfaceType();
- }
-
- @Override
- public FileEntry getFile() {
- return this.getClassType().getFile();
- }
-
- @Override
- public boolean isSealedType() {
- return this.getClassType().isSealedType();
- }
-
- @Override
- public boolean isDelegateType() {
- return this.getClassType().isDelegateType();
- }
-
- @Override
- public boolean isStructType() {
- return this.getClassType().isStructType();
- }
-
- @Override
- public boolean isEnumType() {
- return this.getClassType().isEnumType();
- }
-
- @Override
- public Type accessMemberType(int identifier, boolean caseSensitive, int parameterCount, Entity referingClasstypeOrPackage, FileEntry file) throws UnknownEntityException, AmbiguousEntityException {
- ClassType classtype = this.getClassType();
- Type member = classtype.accessMemberType(identifier, caseSensitive, parameterCount, referingClasstypeOrPackage, file);
- if (member.isClassType()) {
- member = ((ClassType)member).parameterizeCanonical();
- }
-
- return this.replaceType(member);
- }
-
- public Type parameterize(Type[] argumenttypes) {
- int[] variances = new int[argumenttypes.length];
-
- return this.parameterize(argumenttypes, variances);
- }
-
- public Type parameterize(Type[] argumenttypes, int[] variances) {
- ClassType classtype = this.getClassType();
- int len = classtype.getParametertypeCount();
- int absolutelen = classtype.getAbsoluteParametertypeCount();
- if (len < absolutelen) {
- Type[] oldargtypes = this.getAbsoluteArgumentTypes();
- int[] oldvariances = this.getAbsoluteArgumentVariances();
- Type[] absoluteargumenttypes = new Type[absolutelen];
- int[] absolutevariances = new int[absolutelen];
-
- for(int i = 0; i < absolutelen - len; ++i) {
- absoluteargumenttypes[i] = oldargtypes[i];
- absolutevariances[i] = oldvariances[i];
- }
-
- for(int i = absolutelen - len; i < absolutelen; ++i) {
- absoluteargumenttypes[i] = argumenttypes[i - absolutelen + len];
- absolutevariances[i] = variances[i - absolutelen + len];
- }
-
- argumenttypes = absoluteargumenttypes;
- variances = this.absoluteargumentvariances;
- }
-
- return this.space.getParameterizedtype(classtype, argumenttypes, variances);
- }
-
- public SetOf getAllSuperTypes() {
- if (this.allSuperTypes == null) {
- this.allSuperTypes = new SetOf<>(this.space);
- SetOf allSuperTypesOfClasstype = this.classtype.getAllSuperTypes();
- allSuperTypesOfClasstype.DEFAULT_ITERATOR.init();
-
- while(allSuperTypesOfClasstype.DEFAULT_ITERATOR.hasMoreElements()) {
- try {
- this.allSuperTypes.put(this.replaceType((Type)allSuperTypesOfClasstype.DEFAULT_ITERATOR.nextKey()));
- } catch (UnknownEntityException var3) {
- }
- }
- }
-
- return this.allSuperTypes;
- }
-
- public Type replaceType(Type type) throws UnknownEntityException {
- return this.replaceType(type, true);
- }
-
- public Type replaceType(Type type, boolean readaccess) throws UnknownEntityException {
- if (type.isArrayType()) {
- return this.space.getArraytype(this.replaceType(((ArrayType)type).getElementType()), ((ArrayType)type).getDimension());
- } else if (type.isParameterType()) {
- for(int i = 0; i < this.absoluteargumenttypes.length; ++i) {
- try {
- if (this.classtype.getAbsoluteParametertype(i) == type) {
- return this.absoluteargumenttypes[i];
- }
- } catch (UnknownEntityException var11) {
- }
- }
-
- return type;
- } else if (!type.isParameterizedType()) {
- return type;
- } else {
- Type[] memberargumenttypes = ((ParameterizedType)type).getAbsoluteArgumentTypes();
- int[] membervariances = ((ParameterizedType)type).getAbsoluteArgumentVariances();
- int[] replacedvariances = new int[memberargumenttypes.length];
- Type[] replacedtypes = new Type[memberargumenttypes.length];
-
- label100:
- for(int i = 0; i < memberargumenttypes.length; ++i) {
- Type membertype = memberargumenttypes[i];
-
- for(int j = 0; j < this.absoluteargumenttypes.length; ++j) {
- if (this.classtype.getAbsoluteParametertype(j) == membertype) {
- Type argumentboundtype = this.classtype.getAbsoluteParametertype(j).getErasedType();
- replacedtypes[i] = this.absoluteargumenttypes[j];
- switch(membervariances[i]) {
- case 0:
- if (readaccess) {
- replacedvariances[i] = this.absoluteargumentvariances[j];
- } else {
- switch(this.absoluteargumentvariances[j]) {
- case 0:
- replacedvariances[i] = this.absoluteargumentvariances[j];
- continue label100;
- case 1:
- case 2:
- case 3:
- throw new UnknownEntityException();
- }
- }
- continue label100;
- case 1:
- case 2:
- if (readaccess) {
- switch(this.absoluteargumentvariances[j]) {
- case 0:
- case 1:
- case 2:
- replacedvariances[i] = 2;
- if (argumentboundtype == this.absoluteargumenttypes[j]) {
- replacedvariances[i] = 1;
- }
- continue label100;
- case 3:
- replacedvariances[i] = 1;
- replacedtypes[i] = argumentboundtype;
- }
- } else {
- switch(this.absoluteargumentvariances[j]) {
- case 0:
- case 3:
- replacedvariances[i] = 2;
- if (argumentboundtype == this.absoluteargumenttypes[j]) {
- replacedvariances[i] = 1;
- }
- continue label100;
- case 1:
- case 2:
- throw new UnknownEntityException();
- }
- }
- continue label100;
- case 3:
- if (readaccess) {
- switch(this.absoluteargumentvariances[j]) {
- case 0:
- case 3:
- replacedvariances[i] = 3;
- if (argumentboundtype == this.absoluteargumenttypes[j]) {
- replacedvariances[i] = 0;
- }
- continue label100;
- case 1:
- case 2:
- replacedvariances[i] = 1;
- replacedtypes[i] = argumentboundtype;
- }
- } else {
- switch(this.absoluteargumentvariances[j]) {
- case 0:
- case 1:
- case 2:
- replacedvariances[i] = 3;
- if (argumentboundtype == this.absoluteargumenttypes[j]) {
- replacedvariances[i] = 0;
- }
- continue label100;
- case 3:
- replacedvariances[i] = 0;
- replacedtypes[i] = argumentboundtype;
- }
- }
- default:
- continue label100;
- }
- }
- }
-
- replacedtypes[i] = this.replaceType(membertype, readaccess);
- replacedvariances[i] = membervariances[i];
- }
-
- return this.space.getParameterizedtype(((ParameterizedType)type).getClassType(), replacedtypes, replacedvariances);
- }
- }
-
- public ClassType getClassType() {
- return this.classtype;
- }
-
- @Override
- public int getID() {
- return this.id;
- }
-
- @Override
- public Language getLanguage() {
- return this.getClassType().getLanguage();
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/PointerType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/PointerType.java
deleted file mode 100644
index dc2f164..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/PointerType.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import static com.apkide.analysis.api.clm.TypeSemantic.UNKNOWN_SEMANTIC;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class PointerType extends Type {
- private EntitySpace space;
- private int id;
- private Type type;
-
- protected PointerType(FileSpace fileSpace, EntitySpace space) {
- super(fileSpace,space, UNKNOWN_SEMANTIC);
- this.space = space;
- }
-
- protected PointerType(FileSpace fileSpace, EntitySpace space, Type type) {
- super(fileSpace,space, UNKNOWN_SEMANTIC);
- this.space = space;
- this.id = space.declareEntity(this);
- this.type = type;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.id = stream.readInt();
- this.type = (Type)this.space.getEntity(stream.readInt());
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.id);
- stream.writeInt(this.space.getID(this.type));
- }
-
- public Type getType() {
- return this.type;
- }
-
- @Override
- public int getID() {
- return this.id;
- }
-
- @Override
- public Language getLanguage() {
- return this.getType().getLanguage();
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/PrimitiveType.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/PrimitiveType.java
deleted file mode 100644
index 2a8baf1..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/PrimitiveType.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-
-import java.io.IOException;
-
-public final class PrimitiveType extends Type {
- private final FileSpace filespace;
- private final EntitySpace space;
- private int entity;
- private int languageID;
-
- protected PrimitiveType(EntitySpace space, FileSpace filespace, int semantic, Language language) {
- super(filespace,space, semantic);
- this.filespace = filespace;
- this.space = space;
- this.languageID = filespace.getLanguageID(language);
- this.entity = space.declareEntity(this);
- }
-
- protected PrimitiveType(EntitySpace space, FileSpace filespace) {
- super(filespace,space);
- this.filespace = filespace;
- this.space = space;
- }
-
- @Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
- super.load(stream);
- this.entity = stream.readInt();
- this.languageID = stream.readInt();
- }
-
- @Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
- super.store(stream);
- stream.writeInt(this.entity);
- stream.writeInt(this.languageID);
- }
-
- @Override
- public int getID() {
- return this.entity;
- }
-
- @Override
- public Language getLanguage() {
- return this.filespace.getLanguage(this.languageID);
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Variable.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/Variable.java
deleted file mode 100644
index 6cf3d84..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Variable.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.apkide.analysis.api.clm;
-
-import com.apkide.analysis.api.cle.Language;
-
-public class Variable {
- private final FileEntry file;
- private final int line;
- private final int startColumn;
- private final int endcolumn;
- private final int identifier;
- private final Type type;
- private final Language myLanguage;
-
- public Variable(FileEntry file,Language language, int line, int startColumn, int endcolumn, int identifier, Type type) {
- this.file = file;
- this.line = line;
- this.startColumn = startColumn;
- this.endcolumn = endcolumn;
- this.identifier = identifier;
- this.type = type;
- this.myLanguage=language;
- }
-
- public String getHTMLString() {
- return getLanguage().getRenderer() != null ? getLanguage().getRenderer().getHTMLString(this) : "";
- }
-
- public FileEntry getFile() {
- return this.file;
- }
-
- public int getLine() {
- return this.line;
- }
-
- public int getStartColumn() {
- return this.startColumn;
- }
-
- public int getEndcolumn() {
- return this.endcolumn;
- }
-
- public int getIdentifier() {
- return this.identifier;
- }
-
- public Type getType() {
- return this.type;
- }
-
- public Language getLanguage() {
- return myLanguage;
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/FileReaderCallback.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/FileReaderCallback.java
deleted file mode 100644
index 3318119..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/FileReaderCallback.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.apkide.analysis.api.clm.callback;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-
-public interface FileReaderCallback {
- Reader createBomReader(InputStream inStream, String fallbackEncoding)throws IOException;
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/HighlighterCallback.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/HighlighterCallback.java
deleted file mode 100644
index 9f27919..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/HighlighterCallback.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.apkide.analysis.api.clm.callback;
-
-import com.apkide.analysis.api.clm.FileEntry;
-
-public interface HighlighterCallback {
-
- void fileStarted();
-
- void unifedLineFound(int line);
-
- void delegateFound(int startLine, int startColumn, int endLine, int endColumn);
-
- void keywordFound(int startLine, int startColumn, int endLine, int endColumn);
-
- void namespaceFound(int startLine, int startColumn, int endLine, int endColumn);
-
- void typeFound(int startLine, int startColumn, int endLine, int endColumn);
-
- void fileFinished(FileEntry fileEntry);
-
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/OpenFileCallback.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/OpenFileCallback.java
deleted file mode 100644
index e7fe934..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/OpenFileCallback.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.apkide.analysis.api.clm.callback;
-
-
-
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-
-import java.io.Reader;
-
-public interface OpenFileCallback {
- Reader getOpenFileReader(FileEntry fileEntry);
-
- long getOpenFileVersion(FileEntry fileEntry);
-
- long getOpenFileSize(FileEntry fileEntry);
-
- boolean areOpenFilesSynchronized();
-
- boolean isOpenFile(FileEntry fileEntry);
-
- SetOfFileEntry getOpenFiles();
-
- void update();
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/DefaultFileNamePatternMatcher.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/DefaultFileNamePatternMatcher.java
deleted file mode 100644
index 21b8f44..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/DefaultFileNamePatternMatcher.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.apkide.analysis.api.clm.common;
-
-public class DefaultFileNamePatternMatcher extends FileNamePatternMatcher {
- @Override
- public boolean match(String fileName, String pattern) {
- //*.xxx
- return fileName.toLowerCase().endsWith(pattern.substring(1).toLowerCase());
- }
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/FileNamePatternMatcher.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/FileNamePatternMatcher.java
deleted file mode 100644
index 342ca79..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/common/FileNamePatternMatcher.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.apkide.analysis.api.clm.common;
-
-public abstract class FileNamePatternMatcher {
-
- private static final Object myLock = new Object();
-
- private static FileNamePatternMatcher sMatcher = new DefaultFileNamePatternMatcher();
-
- public static void set(FileNamePatternMatcher matcher) {
- synchronized (myLock) {
- sMatcher = matcher;
- }
- }
-
- public static FileNamePatternMatcher get() {
- synchronized (myLock) {
- return sMatcher;
- }
- }
-
- public abstract boolean match(String fileName, String pattern);
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/JFlexLexer.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/JFlexLexer.java
deleted file mode 100644
index 95ec871..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/JFlexLexer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.apkide.analysis.api.clm.util;
-
-import java.io.IOException;
-import java.io.Reader;
-
-public interface JFlexLexer {
-
- void yyreset(Reader reader);
-
- void yybegin(int newState);
-
- boolean yyatEOF();
-
- int yylex()throws IOException;
-
- int yystate();
-
- int yylength();
-
- String yytext();
-
- void yypushback(int number);
-
- char yycharat(int position);
-
- char[] getBuffer();
-
- int getBufferIndex();
-
- int getCharIndex();
-
- void yyclose()throws IOException;
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/Parser.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/Parser.java
deleted file mode 100644
index 9a18586..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/Parser.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.apkide.analysis.api.clm.util;
-
-public abstract class Parser {
-
-}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/TokenSpace.java b/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/TokenSpace.java
deleted file mode 100644
index b6f8848..0000000
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/util/TokenSpace.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.apkide.analysis.api.clm.util;
-
-public class TokenSpace {
-
-}
diff --git a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppCodeModel.java b/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppCodeModel.java
deleted file mode 100644
index 4fee3e9..0000000
--- a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppCodeModel.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.apkide.analysis.language.cpp;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.Model;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.List;
-
-public class CppCodeModel implements CodeModel {
- private final Model myModel;
- private final CppLanguage myCppLanguage;
-
- public CppCodeModel(Model model) {
- myModel = model;
- myCppLanguage=new CppLanguage(model);
- }
-
- @NonNull
- @Override
- public String getName() {
- return "C/C++";
- }
-
- @NonNull
- @Override
- public String[] getDefaultFilePatterns() {
- return new String[]{"*.c", "*.h", "*.cpp", "*.hpp"};
- }
-
- @NonNull
- @Override
- public List getLanguages() {
- return List.of(myCppLanguage);
- }
-
- @Override
- public void update() {
-
- }
-
- @Override
- public boolean isSupportsFileArchives() {
- return false;
- }
-
- @Override
- public long getArchiveVersion(String filePath) {
- return 0;
- }
-
- @Override
- public Reader getArchiveEntryReader(String filePath, String entryName, String encoding) throws IOException {
- return null;
- }
-
- @Override
- public String[] getArchiveEntries(String filePath) {
- return new String[0];
- }
-
- @Override
- public void close() {
-
- }
-}
diff --git a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLanguage.java b/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLanguage.java
deleted file mode 100644
index 73e3785..0000000
--- a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLanguage.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.apkide.analysis.language.cpp;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.apkide.analysis.api.cle.CodeAnalyzer;
-import com.apkide.analysis.api.cle.CodeRenderer;
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.cle.SignatureAnalyzer;
-import com.apkide.analysis.api.cle.Syntax;
-import com.apkide.analysis.api.cle.Tools;
-import com.apkide.analysis.api.cle.TypeSystem;
-import com.apkide.analysis.api.clm.Model;
-
-import java.util.Set;
-
-public class CppLanguage implements Language {
-
- private final Model myModel;
-
- public CppLanguage(Model model) {
- myModel = model;
- }
-
- @NonNull
- @Override
- public String getName() {
- return "C++";
- }
-
- @Override
- public boolean isParenChar(char c) {
- switch (c) {
- case '(':
- case ':':
- case ';':
- case '[':
- case '{':
- case '}':
- return true;
- default:
- return false;
- }
- }
-
- @Override
- public void shrink() {
-
- }
-
- @Nullable
- @Override
- public Set> getDefaultOptions() {
- return null;
- }
-
- @Nullable
- @Override
- public Syntax getSyntax() {
- return null;
- }
-
- @Nullable
- @Override
- public Tools getTools() {
- return null;
- }
-
- @Nullable
- @Override
- public SignatureAnalyzer getSignatureAnalyzer() {
- return null;
- }
-
- @Nullable
- @Override
- public TypeSystem getTypeSystem() {
- return null;
- }
-
- @Nullable
- @Override
- public CodeRenderer getRenderer() {
- return null;
- }
-
- @Nullable
- @Override
- public CodeAnalyzer getAnalyzer() {
- return null;
- }
-}
diff --git a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLexer.flex b/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLexer.flex
deleted file mode 100644
index f11d1b1..0000000
--- a/analysis-language/src/main/java/com/apkide/analysis/language/cpp/CppLexer.flex
+++ /dev/null
@@ -1,228 +0,0 @@
-package com.apkide.analysis.language.cpp;
-
-import com.apkide.analysis.api.clm.util.JFlexLexer;
-import java.io.Reader;
-import java.io.IOException;
-
-%%
-
-%{
- public char[] getBuffer()
- {
- return zzBuffer;
- }
-
- public int getBufferIndex()
- {
- return zzStartRead;
- }
-
- public int getCharIndex()
- {
- return (int)yychar;
- }
-%}
-
-%ignorecase
-%unicode
-%public
-%class CppLexer
-%implements JFlexLexer
-%int
-%char
-
-
-WHITE_SPACE_CHAR = [\ \n\r\t\f]
-
-IDENTIFIER = [:jletter:] [:jletterdigit:]*
-
-C_STYLE_COMMENT=("/*"[^"*"]{COMMENT_TAIL})|"/*"
-DOC_COMMENT="/*""*"+("/"|([^"/""*"]{COMMENT_TAIL}))?
-COMMENT_TAIL=([^"*"]*("*"+[^"*""/"])?)*("*"+"/")?
-END_OF_LINE_COMMENT="/""/"[^\r\n]*
-
-DIGIT = [0-9]
-DIGIT_OR_UNDERSCORE = [_0-9]
-DIGITS = {DIGIT} | {DIGIT} {DIGIT_OR_UNDERSCORE}*
-HEX_DIGIT_OR_UNDERSCORE = [_0-9A-Fa-f]
-
-INTEGER_LITERAL = {DIGITS} | {HEX_INTEGER_LITERAL} | {BIN_INTEGER_LITERAL}
-LONG_LITERAL = {INTEGER_LITERAL} [Ll]
-HEX_INTEGER_LITERAL = 0 [Xx] {HEX_DIGIT_OR_UNDERSCORE}*
-BIN_INTEGER_LITERAL = 0 [Bb] {DIGIT_OR_UNDERSCORE}*
-
-FLOAT_LITERAL = ({DEC_FP_LITERAL} | {HEX_FP_LITERAL}) [Ff] | {DIGITS} [Ff]
-DOUBLE_LITERAL = ({DEC_FP_LITERAL} | {HEX_FP_LITERAL}) [Dd]? | {DIGITS} [Dd]
-DEC_FP_LITERAL = {DIGITS} {DEC_EXPONENT} | {DEC_SIGNIFICAND} {DEC_EXPONENT}?
-DEC_SIGNIFICAND = "." {DIGITS} | {DIGITS} "." {DIGIT_OR_UNDERSCORE}*
-DEC_EXPONENT = [Ee] [+-]? {DIGIT_OR_UNDERSCORE}*
-HEX_FP_LITERAL = {HEX_SIGNIFICAND} {HEX_EXPONENT}
-HEX_SIGNIFICAND = 0 [Xx] ({HEX_DIGIT_OR_UNDERSCORE}+ "."? | {HEX_DIGIT_OR_UNDERSCORE}* "." {HEX_DIGIT_OR_UNDERSCORE}+)
-HEX_EXPONENT = [Pp] [+-]? {DIGIT_OR_UNDERSCORE}*
-
-ESCAPE_SEQUENCE = \\[^\r\n]
-CHARACTER_LITERAL = "'" ([^\\\'\r\n] | {ESCAPE_SEQUENCE})* ("'"|\\)?
-STRING_LITERAL = \" ([^\\\"\r\n] | {ESCAPE_SEQUENCE})* (\"|\\)?
-
-%%
-{
-
- {C_STYLE_COMMENT} |
- {END_OF_LINE_COMMENT} { return Comment; }
- {DOC_COMMENT} { return DocComment; }
-
- {LONG_LITERAL} |
- {INTEGER_LITERAL} |
- {FLOAT_LITERAL} |
- {DOUBLE_LITERAL} |
- {CHARACTER_LITERAL} |
- {STRING_LITERAL} { return Literal; }
-
- "#define" |
- "#elif" |
- "#else" |
- "#endif" |
- "#error" |
- "#ifdef" |
- "#ifndef" |
- "#if" |
- "#import" |
- "#include" |
- "#line" |
- "#pragma" |
- "#undef" |
- "#using" {return Preprocessor;}
-
-
- "break" |
- "case" |
- "catch" |
- "continue" |
- "default" |
- "do" |
- "else" |
- "for" |
- "goto" |
- "enum" |
- "if" |
- "inline" |
- "mutable" |
- "noinline" |
- "return" |
- "safecast" |
- "sealed" |
- "selectany" |
- "sizeof" |
- "static_cast" |
- "switch" |
- "template" |
- "this" |
- "thread" |
- "throw" |
- "try" |
- "typedef" |
- "typeid" |
- "typename" |
- "using" |
- "uuid" |
- "value" |
- "virtual" |
- "while" |
- "new" |
- "delete" |
- "this" |
- "friend" |
- "using" |
- "throw" |
- "try" |
- "catch" |
- "class" |
- "typename" |
- "template" |
- "namespace" |
- "static" |
- "struct" |
- "union" |
- "volatile" |
- "register" |
- "extern" |
- "const" |
- "signed" |
- "unsigned" |
- "bool" |
- "char" |
- "double" |
- "int" |
- "long" |
- "float" |
- "short" |
- "void" |
- "public" |
- "protected" |
- "private" |
- "virtual" |
- "inline" |
- "virtual" |
- "explicit" |
- "export" |
- "bool" |
- "wchar_t"
- { return Keyword; }
-
- {IDENTIFIER} { return Identifier; }
-
- "==" |
- "!=" |
- "||" |
- "++" |
- "--" |
- "<" |
- "<=" |
- "<<="|
- "<<" |
- ">" |
- "&" |
- "&&" |
- "+=" |
- "-=" |
- "*=" |
- "/=" |
- "&=" |
- "|=" |
- "^=" |
- "%=" { return Operator; }
-
- "(" |
- ")" |
- "{" |
- "}" |
- "[" |
- "]" |
- ";" |
- "," |
- "..." |
- "." { return Separator; }
-
- "=" |
- "!" |
- "~" |
- "?" |
- ":" |
- "+" |
- "-" |
- "*" |
- "/" |
- "|" |
- "^" |
- "%" { return Operator; }
- "@" { return Plain; }
-
- "::" |
- "->" { return Operator; }
-
-{WHITE_SPACE_CHAR}+ {return Plain;}
-
- }
-. { return Plain; }
- <> { return YYEOF; }
-
diff --git a/app/build.gradle b/app/build.gradle
index 4934afa..4d9de48 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -94,6 +94,7 @@ dependencies {
implementation libs.androidx.preference
implementation libs.material
implementation project(':common')
+ implementation project(':openapi')
implementation project(':engine')
implementation project(':apktool:androlib')
implementation project(':apktool:common')
diff --git a/analysis-api/.gitignore b/cl/.gitignore
similarity index 100%
rename from analysis-api/.gitignore
rename to cl/.gitignore
diff --git a/analysis-language/build.gradle b/cl/build.gradle
similarity index 86%
rename from analysis-language/build.gradle
rename to cl/build.gradle
index a1f4296..0448f5b 100644
--- a/analysis-language/build.gradle
+++ b/cl/build.gradle
@@ -3,12 +3,13 @@ plugins {
}
android {
- namespace 'com.apkide.analysis.language'
+ namespace 'com.apkide.analysis'
compileSdk 33
defaultConfig {
minSdk 26
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}
@@ -29,6 +30,5 @@ dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
coreLibraryDesugaring libs.desugar.jdk.libs.nio
implementation project(':common')
- implementation project(':analysis-api')
testImplementation libs.junit
}
\ No newline at end of file
diff --git a/analysis-api/consumer-rules.pro b/cl/consumer-rules.pro
similarity index 100%
rename from analysis-api/consumer-rules.pro
rename to cl/consumer-rules.pro
diff --git a/analysis-api/proguard-rules.pro b/cl/proguard-rules.pro
similarity index 100%
rename from analysis-api/proguard-rules.pro
rename to cl/proguard-rules.pro
diff --git a/analysis-api/src/main/AndroidManifest.xml b/cl/src/main/AndroidManifest.xml
similarity index 100%
rename from analysis-api/src/main/AndroidManifest.xml
rename to cl/src/main/AndroidManifest.xml
diff --git a/cl/src/main/java/com/apkide/analysis/CLPlugin.java b/cl/src/main/java/com/apkide/analysis/CLPlugin.java
new file mode 100644
index 0000000..44c4b66
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/CLPlugin.java
@@ -0,0 +1,23 @@
+package com.apkide.analysis;
+
+import com.apkide.analysis.cle.BinaryArchiveSupport;
+import com.apkide.analysis.cle.EditorMode;
+import com.apkide.analysis.cle.ProjectSupport;
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.Model;
+
+public interface CLPlugin {
+ void init();
+
+ String getPluginName();
+
+ String getPluginVersion();
+
+ EditorMode createEditorMode();
+
+ ProjectSupport createProjectSupport();
+
+ BinaryArchiveSupport getBinaryArchiveSupport();
+
+ Language createLanguageProvider(Model model);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/PluginContext.java b/cl/src/main/java/com/apkide/analysis/PluginContext.java
new file mode 100644
index 0000000..cb4d233
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/PluginContext.java
@@ -0,0 +1,38 @@
+package com.apkide.analysis;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+
+public abstract class PluginContext {
+
+ private static final Object sLock = new Object();
+
+ private static PluginContext sContext;
+
+ public static void set(PluginContext context) {
+ synchronized (sLock) {
+ sContext = context;
+ }
+ }
+
+ public static PluginContext get() {
+ synchronized (sLock) {
+ return sContext;
+ }
+ }
+
+
+ public abstract String getString(@StringRes int id);
+
+ @Nullable
+ public T getOption(@NonNull String key) {
+ return getOption(key, null);
+ }
+
+ @Nullable
+ public abstract T getOption(@NonNull String key, @Nullable Object defValue);
+
+ public abstract void setOption(@NonNull String key, @Nullable Object value);
+
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/BinaryArchiveSupport.java b/cl/src/main/java/com/apkide/analysis/cle/BinaryArchiveSupport.java
new file mode 100644
index 0000000..8272de7
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/BinaryArchiveSupport.java
@@ -0,0 +1,16 @@
+package com.apkide.analysis.cle;
+
+import java.io.IOException;
+import java.io.Reader;
+
+public interface BinaryArchiveSupport {
+ String[] getSupportedArchiveFileExtensions();
+
+ boolean supportsClassfileArchives();
+
+ Reader getSignatureFileContent(String filePath, String entryName) throws IOException;
+
+ String[] getSignatureFiles(String filePath) throws IOException;
+
+ Reader getMetadataXml(String filePath) throws IOException;
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/EditorIndenter.java b/cl/src/main/java/com/apkide/analysis/cle/EditorIndenter.java
new file mode 100644
index 0000000..07bb90d
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/EditorIndenter.java
@@ -0,0 +1,39 @@
+package com.apkide.analysis.cle;
+
+import com.apkide.analysis.cle.api.formatter.CodeFormatterCallback;
+import com.apkide.analysis.cle.api.formatter.CodeFormatterOption;
+import com.apkide.analysis.cle.api.formatter.CodeFormatterSizeOptions;
+import java.util.List;
+import java.util.Set;
+
+public interface EditorIndenter {
+ List extends CodeFormatterOption> getAllOptions();
+
+ Set getDefaultOptions();
+
+ void setOptions(Set options);
+
+ void setSizeOptions(CodeFormatterSizeOptions sizeOptions);
+
+ void outCommentLines(CodeFormatterCallback callback, int startLine, int endLine);
+
+ void unOutCommentLines(CodeFormatterCallback callback, int startLine, int endLine);
+
+ void expandSelection(CodeFormatterCallback callback, int startLine, int startColumn, int endLine, int endColumn);
+
+ void expandSelectionToStatements(CodeFormatterCallback callback,int startLine, int startColumn, int endLine, int endColumn);
+
+ void learnStyle(CodeFormatterCallback callback, Set options, CodeFormatterSizeOptions sizeOptions);
+
+ void autoIndentAfterPaste(CodeFormatterCallback callback, int startLine, int endLine);
+
+ void autoFormatLines(CodeFormatterCallback callback, int startLine, int endLine);
+
+ void autoIndentLines(CodeFormatterCallback callback, int startLine, int endLine);
+
+ void autoIndentLine(CodeFormatterCallback callback, int line);
+
+ void indentAfterLineBreakInsertion(CodeFormatterCallback callback, int line, int column);
+
+ void indentAfterCharEvent(CodeFormatterCallback callback, char c, int line, int column);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/EditorMode.java b/cl/src/main/java/com/apkide/analysis/cle/EditorMode.java
new file mode 100644
index 0000000..9cffbc5
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/EditorMode.java
@@ -0,0 +1,19 @@
+package com.apkide.analysis.cle;
+
+import com.apkide.analysis.cle.api.codetemplates.CodeTemplate;
+
+public interface EditorMode {
+ int getFileIcon(boolean errors);
+
+ String getName();
+
+ String[] getDefaultFilePatterns();
+
+ Highlighter createHighlighter();
+
+ ParenMatcher createEditorParenMatcher();
+
+ EditorIndenter getEditorIndenter();
+
+ CodeTemplate[] getDefaultCodeTemplates();
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/Highlighter.java b/cl/src/main/java/com/apkide/analysis/cle/Highlighter.java
new file mode 100644
index 0000000..7e43552
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/Highlighter.java
@@ -0,0 +1,32 @@
+package com.apkide.analysis.cle;
+
+import com.apkide.analysis.cle.api.highlighter.HighlightingStyle;
+import com.apkide.analysis.cle.api.highlighter.HighlightingTokenInfo;
+import com.apkide.analysis.cle.api.highlighter.TokenIterator;
+import java.io.Reader;
+
+public interface Highlighter {
+ byte getDefaultState();
+
+ byte highlightLine(Reader reader, byte state, TokenIterator iterator);
+
+ int getStyleCount();
+
+ boolean allowsCompletion(int style);
+
+ HighlightingTokenInfo[] getTokenInfos();
+
+ HighlightingStyle[] getDefaultStyles();
+
+ boolean isHyperlinkableIdentifierStyle(byte style);
+
+ byte getSemanticHighlightingUnIfedLineStyle();
+
+ byte getSemanticHighlightingTypeStyle();
+
+ byte getSemanticHighlightingDelegateStyle();
+
+ byte getSemanticHighlightingNamespaceStyle();
+
+ byte getSemanticHighlightingKeywordStyle();
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/ParenMatcher.java b/cl/src/main/java/com/apkide/analysis/cle/ParenMatcher.java
new file mode 100644
index 0000000..b7cb780
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/ParenMatcher.java
@@ -0,0 +1,10 @@
+package com.apkide.analysis.cle;
+
+import com.apkide.analysis.cle.api.parenmatcher.ParenMatchResult;
+import com.apkide.analysis.cle.api.parenmatcher.ParenMatcherEditor;
+
+public interface ParenMatcher {
+ void findMatchingParen(ParenMatcherEditor editor, int caretLine, int caretColumn, ParenMatchResult result);
+
+ boolean isParenChar(char c);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/ProjectSupport.java b/cl/src/main/java/com/apkide/analysis/cle/ProjectSupport.java
new file mode 100644
index 0000000..b501847
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/ProjectSupport.java
@@ -0,0 +1,18 @@
+package com.apkide.analysis.cle;
+
+
+public interface ProjectSupport {
+ int getFileIcon();
+
+ String getPackageGuid();
+
+ String[] getProjectFilePatterns();
+
+ boolean isJavaProjectType();
+
+ String getLanguageNameForItemTemplates();
+
+ boolean shouldBeAdded(String filePath, boolean isNormalFile);
+
+ boolean shouldBeCompiledByDefault(String filePath);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/XmlUtilities.java b/cl/src/main/java/com/apkide/analysis/cle/api/XmlUtilities.java
new file mode 100644
index 0000000..5fd96e3
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/XmlUtilities.java
@@ -0,0 +1,37 @@
+package com.apkide.analysis.cle.api;
+
+import com.apkide.analysis.cle.api.codetemplates.CodeTemplate;
+import com.apkide.analysis.cle.api.highlighter.HighlightingStyle;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+import java.io.Reader;
+
+public class XmlUtilities {
+
+
+ public static HighlightingStyle[] getHighlightingStylesFromXml(Reader xmlReader) {
+ XStream xstream = new XStream(new DomDriver());
+ xstream.setMode(1001);
+ xstream.alias("highlightingStyle", HighlightingStyle.class);
+ xstream.alias("highlightingStyles", HighlightingStyle[].class);
+
+ try {
+ return (HighlightingStyle[])xstream.fromXML(xmlReader);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public static CodeTemplate[] getCodeTemplatesFromXml(Reader xmlReader) {
+ XStream xstream = new XStream(new DomDriver());
+ xstream.setMode(1001);
+ xstream.alias("smartTemplate", CodeTemplate.class);
+ xstream.alias("codeTemplates", CodeTemplate[].class);
+
+ try {
+ return (CodeTemplate[])xstream.fromXML(xmlReader);
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/codetemplates/CodeTemplate.java b/cl/src/main/java/com/apkide/analysis/cle/api/codetemplates/CodeTemplate.java
new file mode 100644
index 0000000..400f917
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/codetemplates/CodeTemplate.java
@@ -0,0 +1,21 @@
+package com.apkide.analysis.cle.api.codetemplates;
+
+import androidx.annotation.Keep;
+
+@Keep
+public class CodeTemplate {
+ public String abbrev = "abbrev";
+ public String text = "";
+ public String description = "";
+
+ public CodeTemplate() {
+ }
+
+ public CodeTemplate clone() {
+ CodeTemplate res = new CodeTemplate();
+ res.abbrev = this.abbrev;
+ res.text = this.text;
+ res.description = this.description;
+ return res;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterCallback.java b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterCallback.java
new file mode 100644
index 0000000..d782a48
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterCallback.java
@@ -0,0 +1,43 @@
+package com.apkide.analysis.cle.api.formatter;
+
+import java.io.Reader;
+
+public interface CodeFormatterCallback {
+ int getIndentation(int line);
+
+ Reader getReader();
+
+ void insertLineBreak(int line, int column);
+
+ void insertSpace(int line, int column);
+
+ void removeLineBreak(int startLine, int startColumn, int endLine, int endColumn);
+
+ void removeSpace(int startLine, int startColumn, int endLine, int endColumn);
+
+ void indentLine(int line, int indentSize);
+
+ void select(int startLine, int startColumn, int endLine, int endColumn);
+
+ int getLineCount();
+
+ int getLineWidth(int line);
+
+ char getChar(int line, int column);
+
+ void insertChar(int line, int column, char c);
+
+ int getStyle(int line, int column);
+
+ void insertChars(int line, int column, char[] chars);
+
+ void removeChars(int line, int column, int length);
+
+ void setCaretPosition(int line, int column);
+
+ int getCaretColumn();
+
+ int getCaretLine();
+
+ void removeLineBreak(int line);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterOption.java b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterOption.java
new file mode 100644
index 0000000..51a4cca
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterOption.java
@@ -0,0 +1,12 @@
+package com.apkide.analysis.cle.api.formatter;
+
+public interface CodeFormatterOption {
+ String getGroupName();
+
+ String getName();
+
+ String getPreview(boolean preview);
+
+ @Override
+ String toString();
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterSizeOptions.java b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterSizeOptions.java
new file mode 100644
index 0000000..3f2ae96
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/formatter/CodeFormatterSizeOptions.java
@@ -0,0 +1,25 @@
+package com.apkide.analysis.cle.api.formatter;
+
+public class CodeFormatterSizeOptions {
+ public int indentationSize;
+ public int tabSize;
+ public int maxLineWidth;
+
+ public CodeFormatterSizeOptions() {
+ this.setDefaults();
+ }
+
+ public CodeFormatterSizeOptions clone() {
+ CodeFormatterSizeOptions options = new CodeFormatterSizeOptions();
+ options.indentationSize = this.indentationSize;
+ options.tabSize = this.tabSize;
+ options.maxLineWidth = this.maxLineWidth;
+ return options;
+ }
+
+ private void setDefaults() {
+ this.indentationSize = 4;
+ this.tabSize = 4;
+ this.maxLineWidth = 100;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingStyle.java b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingStyle.java
new file mode 100644
index 0000000..dc1aba6
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingStyle.java
@@ -0,0 +1,25 @@
+package com.apkide.analysis.cle.api.highlighter;
+
+
+import androidx.annotation.Keep;
+
+@Keep
+public class HighlightingStyle {
+ public byte tokenValue;
+ public int fontStyle;
+ public int fontColor = 0xff212121;
+ public int backgroundColor = 0;
+
+ public HighlightingStyle() {
+ }
+
+ @Override
+ public Object clone() {
+ HighlightingStyle result = new HighlightingStyle();
+ result.tokenValue = this.tokenValue;
+ result.fontColor = this.fontColor;
+ result.fontStyle = this.fontStyle;
+ result.backgroundColor = this.backgroundColor;
+ return result;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingTokenInfo.java b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingTokenInfo.java
new file mode 100644
index 0000000..641cfc4
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/HighlightingTokenInfo.java
@@ -0,0 +1,19 @@
+package com.apkide.analysis.cle.api.highlighter;
+
+public class HighlightingTokenInfo {
+ private final byte tokenValue;
+ private final String description;
+
+ public HighlightingTokenInfo(byte tokenValue, String description) {
+ this.tokenValue = tokenValue;
+ this.description = description;
+ }
+
+ public byte getTokenValue() {
+ return this.tokenValue;
+ }
+
+ public String getDescription() {
+ return this.description;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/TokenIterator.java b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/TokenIterator.java
new file mode 100644
index 0000000..97eec90
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/highlighter/TokenIterator.java
@@ -0,0 +1,5 @@
+package com.apkide.analysis.cle.api.highlighter;
+
+public interface TokenIterator {
+ void tokenFound(byte style, int length);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ByteStack.java b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ByteStack.java
new file mode 100644
index 0000000..a65b93e
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ByteStack.java
@@ -0,0 +1,51 @@
+package com.apkide.analysis.cle.api.parenmatcher;
+
+import java.util.NoSuchElementException;
+
+class ByteStack {
+ private byte[] bytes;
+ private int count;
+
+ public ByteStack(int initialCapacity) {
+ this.bytes = new byte[initialCapacity];
+ }
+
+ public ByteStack() {
+ this(10);
+ }
+
+ public void push(byte elem) {
+ if (this.count == this.bytes.length) {
+ byte[] newBytes = new byte[this.bytes.length * 2];
+ System.arraycopy(this.bytes, 0, newBytes, 0, this.bytes.length);
+ this.bytes = newBytes;
+ }
+
+ this.bytes[this.count++] = elem;
+ }
+
+ public byte top() {
+ try {
+ return this.bytes[this.count - 1];
+ } catch (NegativeArraySizeException var2) {
+ throw new NoSuchElementException("ByteStack.top(): empty stack");
+ }
+ }
+
+ public byte pop() {
+ try {
+ return this.bytes[--this.count];
+ } catch (NegativeArraySizeException var2) {
+ this.count = 0;
+ throw new NoSuchElementException("ByteStack.top(): empty stack");
+ }
+ }
+
+ public int elementCount() {
+ return this.count;
+ }
+
+ public void clear() {
+ this.count = 0;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatchResult.java b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatchResult.java
new file mode 100644
index 0000000..67be081
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatchResult.java
@@ -0,0 +1,12 @@
+package com.apkide.analysis.cle.api.parenmatcher;
+
+public class ParenMatchResult {
+ public int parenMatchLine = -1;
+ public int parenMatchColumn;
+ public int caretParenMatchLine = -1;
+ public int caretParenMatchColumn;
+ public boolean matchingValid;
+
+ public ParenMatchResult() {
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatcherEditor.java b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatcherEditor.java
new file mode 100644
index 0000000..ba06aa8
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/cle/api/parenmatcher/ParenMatcherEditor.java
@@ -0,0 +1,11 @@
+package com.apkide.analysis.cle.api.parenmatcher;
+
+public interface ParenMatcherEditor {
+ int getLineCount();
+
+ int getLineWidth(int line);
+
+ char getChar(int line, int column);
+
+ int getStyle(int line, int column);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/ArchiveReader.java b/cl/src/main/java/com/apkide/analysis/clm/ArchiveReader.java
new file mode 100644
index 0000000..86eec61
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/ArchiveReader.java
@@ -0,0 +1,14 @@
+package com.apkide.analysis.clm;
+
+import java.io.IOException;
+import java.io.Reader;
+
+public interface ArchiveReader {
+ long getArchiveVersion(String filePath);
+
+ String[] getArchiveEntries(String filePath) throws IOException;
+
+ Reader getArchiveEntryReader(String filePath, String entryName, String encoding) throws IOException;
+
+ void close();
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/CodeAnalyzer.java b/cl/src/main/java/com/apkide/analysis/clm/CodeAnalyzer.java
new file mode 100644
index 0000000..5e47154
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/CodeAnalyzer.java
@@ -0,0 +1,24 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.SyntaxTree;
+import com.apkide.analysis.clm.api.Type;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+public interface CodeAnalyzer {
+ Type analyzeTypeName(SyntaxTree ast, int line, int column, String name) throws UnknownEntityException;
+
+ void analyzeImports(SyntaxTree ast);
+
+ void analyzeEveryIdentifiers(SyntaxTree ast, SetOfInt identifiers);
+
+ void analyzeEveryIdentifier(SyntaxTree ast, int identifier);
+
+ void analyzeNode(SyntaxTree ast, int node);
+
+ void analyzeNodeWithValues(SyntaxTree ast, int node);
+
+ void analyzeNamesAndTypes(SyntaxTree ast);
+
+ void analyzeErrors(SyntaxTree ast);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/CodeRenderer.java b/cl/src/main/java/com/apkide/analysis/clm/CodeRenderer.java
new file mode 100644
index 0000000..c902e0c
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/CodeRenderer.java
@@ -0,0 +1,42 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.ClassType;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.Namespace;
+import com.apkide.analysis.clm.api.SyntaxTree;
+import com.apkide.analysis.clm.api.Type;
+import com.apkide.analysis.clm.api.Variable;
+import com.apkide.analysis.clm.api.collections.MapOf;
+import com.apkide.analysis.clm.api.collections.SetOf;
+
+public interface CodeRenderer {
+ String renderParameter(String typeName, String identifier);
+
+ String renderTypeName(SyntaxTree ast, int line, int column, Type type);
+
+ String renderDefaultValueString(Type type);
+
+ String renderStaticImports(SyntaxTree ast, MapOf imports);
+
+ String renderFileNamespace(Namespace namespace);
+
+ String renderClassNamespaceStart(Namespace namespace);
+
+ String renderClassNamespaceEnd(Namespace namespace);
+
+ String renderImports(SyntaxTree ast, MapOf imports);
+
+ String renderImports(SyntaxTree ast, int line, int column, SetOf extends Type> imports);
+
+ String renderImports(SyntaxTree ast, int line, int column, SetOf extends Type> imports, SetOf set);
+
+ String getModifierString(int modifier);
+
+ String getHTMLString(Variable variable);
+
+ String getNameString(Entity entity);
+
+ String getFullyQualifiedNameString(Entity entity);
+
+ String getHTMLString(Entity entity);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/Compiler.java b/cl/src/main/java/com/apkide/analysis/clm/Compiler.java
new file mode 100644
index 0000000..ccf0d2c
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/Compiler.java
@@ -0,0 +1,7 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.SyntaxTree;
+
+public interface Compiler {
+ void compile(SyntaxTree ast, boolean createDebugMetadata);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/Language.java b/cl/src/main/java/com/apkide/analysis/clm/Language.java
new file mode 100644
index 0000000..ed2a9f1
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/Language.java
@@ -0,0 +1,28 @@
+package com.apkide.analysis.clm;
+
+public interface Language {
+ String getName();
+
+ void shrink();
+
+ ArchiveReader getArchiveReader();
+
+ PreProcessor getPreProcessor();
+
+ Parser getParser();
+
+ Syntax getSyntax();
+
+ SignatureAnalyzer getSignatureAnalyzer();
+
+ TypeSystem getTypeSystem();
+
+ CodeRenderer getRenderer();
+
+ CodeAnalyzer getCodeAnalyzer();
+
+ ToolsAbstraction getTools();
+
+ Compiler getCompiler();
+
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/Parser.java b/cl/src/main/java/com/apkide/analysis/clm/Parser.java
new file mode 100644
index 0000000..3da381d
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/Parser.java
@@ -0,0 +1,10 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.SyntaxTree;
+
+import java.io.Reader;
+
+public interface Parser {
+ void fillSyntaxTree(Reader reader, FileEntry fileEntry, long syntaxVersion, boolean errors, SyntaxTree ast, boolean parseCode, boolean parseComments);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/PreProcessor.java b/cl/src/main/java/com/apkide/analysis/clm/PreProcessor.java
new file mode 100644
index 0000000..034cfb5
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/PreProcessor.java
@@ -0,0 +1,14 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.SyntaxTree;
+
+import java.io.Reader;
+
+public interface PreProcessor {
+ char POS_ESCAPE_CHAR = '\uFFEE';
+
+ void processVersion(FileEntry fileEntry);
+
+ Reader process(FileEntry fileEntry, Reader reader, SyntaxTree ast);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/SignatureAnalyzer.java b/cl/src/main/java/com/apkide/analysis/clm/SignatureAnalyzer.java
new file mode 100644
index 0000000..bb000ea
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/SignatureAnalyzer.java
@@ -0,0 +1,32 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.ClassType;
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.Member;
+import com.apkide.analysis.clm.api.SyntaxTree;
+
+public interface SignatureAnalyzer {
+ long getDeclarationDigest(SyntaxTree ast);
+
+ long getPublicDeclarationDigest(SyntaxTree ast);
+
+ long getClassDeclarationDigest(SyntaxTree ast);
+
+ void doLoadNamespaces(FileEntry fileEntry);
+
+ void doLoadPositions(FileEntry fileEntry);
+
+ void doLoadTypes(FileEntry fileEntry);
+
+ void doLoadSyntax(FileEntry fileEntry);
+
+ void doLoadSuperClassTypes(FileEntry fileEntry, ClassType classtype);
+
+ void doLoadDefaultSuperClassTypes(FileEntry fileEntry, ClassType classtype);
+
+ void doLoadBoundTypes(FileEntry fileEntry, ClassType classtype);
+
+ void doLoadSuperTypes(FileEntry fileEntry, ClassType classtype);
+
+ void doLoadConstantValueOfField(FileEntry fileEntry, Member member);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/Syntax.java b/cl/src/main/java/com/apkide/analysis/clm/Syntax.java
new file mode 100644
index 0000000..67bbe53
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/Syntax.java
@@ -0,0 +1,102 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.SyntaxTree;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
+
+public interface Syntax {
+ boolean isParameters(int syntaxTag);
+
+ boolean isMethodDeclaration(int syntaxTag);
+
+ boolean isFieldDeclaration(int syntaxTag);
+
+ boolean isArguments(int syntaxTag);
+
+ boolean isClassBody(int syntaxTag);
+
+ boolean isBlock(int syntaxTag);
+
+ boolean isIdentifier(int syntaxTag);
+
+ boolean isExpression(int syntaxTag);
+
+ boolean isStatement(int syntaxTag);
+
+ boolean isMemberDeclaration(int syntaxTag);
+
+ boolean isClassDeclaration(int syntaxTag);
+
+ boolean isLiteral(int syntaxTag);
+
+ boolean isToken(int syntaxTag);
+
+ int getOperator(int syntaxTag);
+
+ int getOperatorPriority(int syntaxTag);
+
+ String getString(int syntaxTag);
+
+ int getTokenLength(int syntaxTag);
+
+ int getIdentifierForKeyword(int syntaxTag);
+
+ boolean hasAttrVariableSlot(int syntaxTag);
+
+ boolean hasAttrDAIndex(int syntaxTag);
+
+ boolean hasAttrTarget(int syntaxTag);
+
+ boolean hasAttrType(int syntaxTag);
+
+ boolean hasAttrValue(int syntaxTag);
+
+ boolean isDeclarationIdentifierNode(SyntaxTree ast, int node);
+
+ boolean isPublicSignatureIdentifierNode(SyntaxTree ast, int node);
+
+ boolean isNonQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
+
+ boolean isQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
+
+ int getQualifiedTypeIdentifierNode(SyntaxTree ast, int node);
+
+ int getTypeIdentifierNodeArgumentCount(SyntaxTree ast, int node);
+
+ boolean isFieldIdentifierNode(SyntaxTree ast, int node);
+
+ boolean isAssignedExpressionNode(SyntaxTree ast, int node);
+
+ boolean isChangedExpressionNode(SyntaxTree ast, int node);
+
+ int getParameterNodeOfParametersNode(SyntaxTree ast, int node, int i);
+
+ int getLeftParenNodeOfParametersNode(SyntaxTree ast, int node);
+
+ int getRightParenNodeOfParametersNode(SyntaxTree ast, int node);
+
+ int getArgumentNodeOfArgumentsNode(SyntaxTree ast, int node, int i);
+
+ int getArgumentCountOfArgumentsNode(SyntaxTree ast, int node);
+
+ int getLeftParenNodeOfArgumentsNode(SyntaxTree ast, int node);
+
+ int getRightParenNodeOfArgumentsNode(SyntaxTree ast, int node);
+
+ ListOfInt getNamespaceNodePairs(SyntaxTree ast);
+
+ ListOfInt getImportNodePairs(SyntaxTree ast);
+
+ int getImportStartLine(SyntaxTree ast);
+
+ int getImportStartColumn(SyntaxTree ast);
+
+ int getImportEndLine(SyntaxTree ast);
+
+ int getImportEndColumn(SyntaxTree ast);
+
+ String getHTMLDocCommentString(SyntaxTree ast, int node);
+
+ boolean hasHTMLDocCommentString(SyntaxTree ast, int node);
+
+ String getRawDocCommentString(SyntaxTree ast, int node);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/ToolsAbstraction.java b/cl/src/main/java/com/apkide/analysis/clm/ToolsAbstraction.java
new file mode 100644
index 0000000..65fbd46
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/ToolsAbstraction.java
@@ -0,0 +1,49 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.Member;
+import com.apkide.analysis.clm.api.Type;
+
+public interface ToolsAbstraction {
+ boolean isHighlighted();
+
+ void requestParameterList(FileEntry fileEntry, int line, int column);
+
+ void requestCompletionList(FileEntry fileEntry, int line, int column);
+
+ void requestClassesCompletionList(FileEntry fileEntry);
+
+ void requestSuperMethodsCompletionList(FileEntry fileEntry, int line, int column);
+
+ void documentize(FileEntry fileEntry, int line, int column);
+
+ void documentize(FileEntry fileEntry);
+
+ void surroundWithTryCatch(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+
+ void addThrows(FileEntry fileEntry, int line, int column);
+
+ void safeDelete(Entity entity);
+
+ void createVariable(FileEntry fileEntry, int line, int column, int identifier, Type type);
+
+ void createField(FileEntry fileEntry, int line, int column, int modifiers, int identifier, Type type);
+
+ void createMethod(FileEntry fileEntry, int line, int column, int modifiers, int identifier, Type type, int[] argModifiers, Type[] argTypes, int[] argNames);
+
+ void inlineVariable(FileEntry fileEntry,int line, int column);
+
+ void createSettersAndGetters(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+
+ void createConstructor(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+
+ void extractMethod(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+
+ void implementMembers(FileEntry fileEntry, int line, int column);
+
+ void overrideMember(FileEntry fileEntry, int line, int column, Member member);
+
+ void introduceVariable(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/TypeSystem.java b/cl/src/main/java/com/apkide/analysis/clm/TypeSystem.java
new file mode 100644
index 0000000..ed615ec
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/TypeSystem.java
@@ -0,0 +1,33 @@
+package com.apkide.analysis.clm;
+
+import com.apkide.analysis.clm.api.ClassType;
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.Namespace;
+import com.apkide.analysis.clm.api.Type;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+public interface TypeSystem {
+ boolean hasTypeparametersOfEnclosingClasstype();
+
+ boolean inheritsBoundTypes();
+
+ boolean supportsGenericTypeNameResolving();
+
+ boolean supportsMethodParametertypeVariables();
+
+ Type getConditionalOperationType(FileEntry fileEntry, Type type1, Type type2) throws UnknownEntityException;
+
+ Type getBinaryNumericOperationType(FileEntry fileEntry, int operator, Type type1, Type type2) throws UnknownEntityException;
+
+ boolean isImplicitConversion(FileEntry fileEntry, Type type1, Type type2);
+
+ boolean isExplicitConversion(FileEntry fileEntry, Type type1, Type type2);
+
+ int getTypeSemanticForClasstype(Namespace namespace, int identifier);
+
+ int getTypeSemanticForPrimitivetype(int number);
+
+ ClassType getRootClasstype(FileEntry fileEntry) throws UnknownEntityException;
+
+ ClassType getArraySuperClasstype(FileEntry fileEntry) throws UnknownEntityException;
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/ArrayType.java b/cl/src/main/java/com/apkide/analysis/clm/api/ArrayType.java
new file mode 100644
index 0000000..1b44d4e
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ArrayType.java
@@ -0,0 +1,71 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+
+public final class ArrayType extends Type {
+ private final EntitySpace mySpace;
+ private int myId;
+ private Type myElementType;
+ private int myDimension;
+
+ protected ArrayType(EntitySpace space) {
+ super(space, 16);
+ this.mySpace = space;
+ }
+
+ protected ArrayType(EntitySpace space, Type elementType, int dimension) {
+ super(space, 16);
+ this.mySpace = space;
+ this.myId = space.declareEntity(this);
+ this.myElementType = elementType;
+ this.myDimension = dimension;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myId = stream.readInt();
+ this.myElementType = (Type)this.mySpace.getEntity(stream.readInt());
+ this.myDimension = stream.readInt();
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myId);
+ stream.writeInt(this.mySpace.getID(this.myElementType));
+ stream.writeInt(this.myDimension);
+ }
+
+ public Type getComponentType() {
+ Type type = this.getElementType();
+
+ while(type.isArrayType()) {
+ type = ((ArrayType)type).getElementType();
+ }
+
+ return type;
+ }
+
+ public int getDimension() {
+ return this.myDimension;
+ }
+
+ public Type getElementType() {
+ return this.myElementType;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return this.getElementType().getLanguage();
+ }
+
+ @Override
+ public int getID() {
+ return this.myId;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ClassType.java b/cl/src/main/java/com/apkide/analysis/clm/api/ClassType.java
similarity index 91%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/ClassType.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/ClassType.java
index d70235b..ab7cf6e 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ClassType.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ClassType.java
@@ -1,19 +1,15 @@
-package com.apkide.analysis.api.clm;
-
-
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.collections.ListOf;
-import com.apkide.analysis.api.clm.collections.MapOf;
-import com.apkide.analysis.api.clm.collections.MapOfInt;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.excpetions.AmbiguousEntityException;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.analysis.api.clm.util.TimeUtils;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.SetOfInt;
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.api.collections.ListOf;
+import com.apkide.analysis.clm.api.collections.MapOf;
+import com.apkide.analysis.clm.api.collections.MapOfInt;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.AmbiguousEntityException;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+import com.apkide.analysis.clm.api.util.TimeUtils;
import java.io.IOException;
@@ -39,9 +35,7 @@ protected long lastAccessTime() {
private Data data() {
this.accessTime = TimeUtils.currentTimeMillis();
- if (this.data != null) {
- return this.data;
- } else {
+ if (this.data == null) {
this.data = new Data();
this.data.inheritedMethodPairs = new ListOf<>(this.space);
this.data.superClasstypes = new ListOf<>(this.space);
@@ -60,19 +54,19 @@ private Data data() {
this.data.allMemberMethods = new MapOfInt<>(this.space);
this.data.allExplicitMemberFields = new MapOfInt<>(this.space);
this.data.allExplicitMemberMethods = new MapOfInt<>(this.space);
- return this.data;
}
+ return this.data;
}
protected ClassType(EntitySpace space, FileSpace filespace, IdentifierSpace identifiers) {
- super(filespace,space);
+ super(space);
this.filespace = filespace;
this.space = space;
this.identifiers = identifiers;
}
protected ClassType(EntitySpace space, FileSpace filespace, IdentifierSpace identifiers, FileEntry file, int declarationNumber, int semantic) {
- super(filespace,space, semantic);
+ super(space, semantic);
this.filespace = filespace;
this.space = space;
this.identifiers = identifiers;
@@ -82,7 +76,7 @@ protected ClassType(EntitySpace space, FileSpace filespace, IdentifierSpace iden
}
@Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
+ protected void load(StoreInputStream stream) throws IOException {
super.load(stream);
this.namespace = (Namespace)this.space.getEntity(stream.readInt());
this.id = stream.readInt();
@@ -209,7 +203,7 @@ protected void load(@NonNull StoreInputStream stream) throws IOException {
}
@Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
+ protected void store(StoreOutputStream stream) throws IOException {
super.store(stream);
stream.writeInt(this.space.getID(this.namespace));
stream.writeInt(this.id);
@@ -534,7 +528,7 @@ public int getID() {
}
public boolean hasTypeparametersOfEnclosingClasstype() {
- return getLanguage().getTypeSystem().hasTypeparametersOfEnclosingClasstype() || this.hasInstanceOfEnclosingClasstype();
+ return this.file.getLanguage().getTypeSystem().hasTypeparametersOfEnclosingClasstype() || this.hasInstanceOfEnclosingClasstype();
}
public boolean hasInstanceOfEnclosingClasstype() {
@@ -593,7 +587,7 @@ public boolean isSealed() {
}
public boolean isApplicable(FileEntry file, int argumentTypeCount) {
- if (!getLanguage().getTypeSystem().supportsGenericTypeNameResolving()) {
+ if (!file.getLanguage().getTypeSystem().supportsGenericTypeNameResolving()) {
return true;
} else {
return argumentTypeCount == this.getParametertypeCount();
@@ -678,7 +672,7 @@ public int getAssembly() {
}
public Entity getContainer() {
- return (Entity)(this.isToplevel() ? this.getNamespace() : this.getEnclosingClassType());
+ return this.isToplevel() ? this.getNamespace() : this.getEnclosingClassType();
}
public Namespace getNamespace() {
@@ -796,7 +790,7 @@ public Type accessFields(FileEntry file, int identifier, boolean caseSensitive,
while(this.data().allMemberFields.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().allMemberFields.DEFAULT_ITERATOR.nextKey());
- Member field = (Member)this.data().allMemberFields.DEFAULT_ITERATOR.nextValue();
+ Member field = this.data().allMemberFields.DEFAULT_ITERATOR.nextValue();
this.data().allMemberFieldsCaseInsensitive.insert(ident, field);
}
}
@@ -808,7 +802,7 @@ public Type accessFields(FileEntry file, int identifier, boolean caseSensitive,
lookupFields.DEFAULT_ITERATOR.init(lookupIdentifier);
while(lookupFields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member field = (Member)lookupFields.DEFAULT_ITERATOR.nextValue();
+ Member field = lookupFields.DEFAULT_ITERATOR.nextValue();
if (field.isVisible(this, referingClassType)) {
fields.put(field);
}
@@ -830,7 +824,7 @@ public Type accessMethods(FileEntry file, int identifier, boolean caseSensitive,
while(this.data().allMemberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().allMemberMethods.DEFAULT_ITERATOR.nextKey());
- Member method = (Member)this.data().allMemberMethods.DEFAULT_ITERATOR.nextValue();
+ Member method = this.data().allMemberMethods.DEFAULT_ITERATOR.nextValue();
this.data().allMemberMethodsCaseInsensitive.insert(ident, method);
}
}
@@ -842,7 +836,7 @@ public Type accessMethods(FileEntry file, int identifier, boolean caseSensitive,
lookupMethods.DEFAULT_ITERATOR.init(lookupIdentifier);
while(lookupMethods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member method = (Member)lookupMethods.DEFAULT_ITERATOR.nextValue();
+ Member method = lookupMethods.DEFAULT_ITERATOR.nextValue();
if (method.isVisible(this, referingClassType)) {
methods.put(method);
}
@@ -858,7 +852,7 @@ public Type accessConstructors(ClassType referingClassType, SetOf constr
this.data().memberConstructors.DEFAULT_ITERATOR.init();
while(this.data().memberConstructors.DEFAULT_ITERATOR.hasMoreElements()) {
- Member constructor = (Member)this.data().memberConstructors.DEFAULT_ITERATOR.nextKey();
+ Member constructor = this.data().memberConstructors.DEFAULT_ITERATOR.nextKey();
if (constructor.isVisible(referingClassType, referingClassType)) {
constructors.put(constructor);
}
@@ -870,10 +864,6 @@ public Type accessConstructors(ClassType referingClassType, SetOf constr
public Type parameterize(Type[] argumenttypes) {
int[] variances = new int[argumenttypes.length];
- for(int i = 0; i < variances.length; ++i) {
- variances[i] = 0;
- }
-
return this.parameterize(argumenttypes, variances);
}
@@ -1104,14 +1094,14 @@ public MapOfInt getDeclaredMemberOperators() {
}
public Type getContainingTypeOfMember(Member method) {
- return (Type)(this.data().containingTypesOfMembers.contains(method) ? this.data().containingTypesOfMembers.get(method) : method.getEnclosingClassType());
+ return this.data().containingTypesOfMembers.contains(method) ? this.data().containingTypesOfMembers.get(method) : method.getEnclosingClassType();
}
public boolean isEnclosedBy(ClassType enclosingClassType) {
if (this == enclosingClassType) {
return true;
} else {
- return this.isToplevel() ? false : this.myEnclosingclasstype.isEnclosedBy(enclosingClassType);
+ return !this.isToplevel() && this.myEnclosingclasstype.isEnclosedBy(enclosingClassType);
}
}
@@ -1172,13 +1162,9 @@ public MapOfInt getAllMemberClasstypes() {
}
@Override
- public Type accessMemberType(int identifier, boolean caseSensitive, int parameterTypeCount,
- Entity referingClasstypeOrPackage, FileEntry file)
- throws UnknownEntityException, AmbiguousEntityException {
-
+ public Type accessMemberType(int identifier, boolean caseSensitive, int parameterTypeCount, Entity referingClasstypeOrPackage, FileEntry file) throws UnknownEntityException, AmbiguousEntityException {
if (this.data().superTypesLoading) {
- return this.accessMemberClasstype(identifier, caseSensitive, parameterTypeCount
- , referingClasstypeOrPackage, file);
+ return this.accessMemberClasstype(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
} else {
this.loadSupertypes();
MapOfInt lookupTypes = this.data().allMemberTypes;
@@ -1203,7 +1189,7 @@ public Type accessMemberType(int identifier, boolean caseSensitive, int paramete
lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
while(lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)lookupTypes.DEFAULT_ITERATOR.nextValue();
+ Type type = lookupTypes.DEFAULT_ITERATOR.nextValue();
ClassType classtype;
if (type.isParameterizedType()) {
classtype = ((ParameterizedType)type).getClassType();
@@ -1239,7 +1225,7 @@ public boolean existsMemberClasstype(int identifier, boolean caseSensitive) {
while(this.data().memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().memberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType)this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType type = this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().memberClasstypesCaseInsensitive.insert(ident, type);
}
}
@@ -1260,7 +1246,7 @@ public boolean existsMemberClasstype(int identifier, boolean caseSensitive) {
while(this.data().allMemberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType)this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType type = this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().allMemberClasstypesCaseInsensitive.insert(ident, type);
}
}
@@ -1284,7 +1270,7 @@ public ClassType accessMemberClasstype(int identifier, boolean caseSensitive, in
while(this.data().memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().memberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType)this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType type = this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().memberClasstypesCaseInsensitive.insert(ident, type);
}
}
@@ -1297,7 +1283,7 @@ public ClassType accessMemberClasstype(int identifier, boolean caseSensitive, in
lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
while(lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)lookupTypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = lookupTypes.DEFAULT_ITERATOR.nextValue();
if (classtype.isApplicable(file, parameterTypeCount) && classtype.isVisible(referingClasstypeOrPackage)) {
if (foundtype != null) {
throw new AmbiguousEntityException();
@@ -1323,7 +1309,7 @@ public ClassType accessMemberClasstype(int identifier, boolean caseSensitive, in
while(this.data().allMemberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int ident = this.identifiers.toUpperCase(this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextKey());
- ClassType type = (ClassType)this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType type = this.data().allMemberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().allMemberClasstypesCaseInsensitive.insert(ident, type);
}
}
@@ -1336,7 +1322,7 @@ public ClassType accessMemberClasstype(int identifier, boolean caseSensitive, in
lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
while(lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)lookupTypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = lookupTypes.DEFAULT_ITERATOR.nextValue();
if (classtype.isApplicable(file, parameterTypeCount) && classtype.isVisible(referingClasstypeOrPackage)) {
if (foundtype != null) {
throw new AmbiguousEntityException();
@@ -1376,7 +1362,7 @@ public boolean isVisible(Entity referingClasstypeOrPackage) {
}
if (enclosingclasstype.getNamespace() == ((ClassType)referingClasstypeOrPackage).getNamespace()
- && enclosingclasstype.getIdentifier() == ((ClassType)referingClasstypeOrPackage).getIdentifier()
+ && enclosingclasstype.getIdentifier() == referingClasstypeOrPackage.getIdentifier()
&& enclosingclasstype.isPartial()
&& ((ClassType)referingClasstypeOrPackage).isPartial()) {
return true;
@@ -1385,7 +1371,7 @@ public boolean isVisible(Entity referingClasstypeOrPackage) {
if (Modifiers.isJavaPrivate(modifiers)
&& referingClasstypeOrPackage.isClassType()
- && this.getEnclosingTopLevelClassType() == ((ClassType)referingClasstypeOrPackage).getEnclosingTopLevelClassType()) {
+ && this.getEnclosingTopLevelClassType() == referingClasstypeOrPackage.getEnclosingTopLevelClassType()) {
return true;
} else {
if (Modifiers.isInternal(modifiers)) {
@@ -1422,9 +1408,7 @@ public boolean isVisible(Entity referingClasstypeOrPackage) {
if (Modifiers.isProtected(modifiers)) {
if (referingClasstypeOrPackage.isNamespace()) {
- if (this.getNamespace() == referingClasstypeOrPackage) {
- return true;
- }
+ return this.getNamespace() == referingClasstypeOrPackage;
} else {
if (this == referingClasstypeOrPackage) {
return true;
@@ -1521,7 +1505,7 @@ private void packMembers() {
while(this.data().memberFields.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = this.data().memberFields.DEFAULT_ITERATOR.nextKey();
- Member field = (Member)this.data().memberFields.DEFAULT_ITERATOR.nextValue();
+ Member field = this.data().memberFields.DEFAULT_ITERATOR.nextValue();
if (field.isExplicitOverriding()) {
this.data().allExplicitMemberFields.insert(identifier, field);
} else {
@@ -1539,7 +1523,7 @@ private void packMembers() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
if (classtype != this) {
this.space.declareInheritanceDependence(this.file, classtype);
MapOfInt memberFields = classtype.getDeclaredMemberFields();
@@ -1547,7 +1531,7 @@ private void packMembers() {
while(memberFields.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = memberFields.DEFAULT_ITERATOR.nextKey();
- Member field = (Member)memberFields.DEFAULT_ITERATOR.nextValue();
+ Member field = memberFields.DEFAULT_ITERATOR.nextValue();
if (!field.isExplicitOverriding()) {
this.data().allMemberFields.insert(identifier, field);
}
@@ -1594,7 +1578,7 @@ private void packMembers() {
while(expFields.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = expFields.DEFAULT_ITERATOR.nextKey();
- Member field = (Member)expFields.DEFAULT_ITERATOR.nextValue();
+ Member field = expFields.DEFAULT_ITERATOR.nextValue();
if (!Modifiers.isJavaPrivate(field.getModifiers())) {
Type containingType = superclasstype.getContainingTypeOfMember(field);
if (containingType.isClassType()) {
@@ -1602,7 +1586,7 @@ private void packMembers() {
this.data().containingTypesOfMembers.put(field, containingType);
}
} else if (supertype.isClassType()) {
- Object e;
+ Type e;
if (supertype.isRawType()) {
e = ((ParameterizedType)containingType).getClassType();
} else {
@@ -1610,7 +1594,7 @@ private void packMembers() {
}
if (field.getEnclosingClassType() != e) {
- this.data().containingTypesOfMembers.put(field, (Type)e);
+ this.data().containingTypesOfMembers.put(field, e);
}
} else {
try {
@@ -1618,7 +1602,7 @@ private void packMembers() {
if (field.getEnclosingClassType() != type) {
this.data().containingTypesOfMembers.put(field, type);
}
- } catch (UnknownEntityException var14) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1632,7 +1616,7 @@ private void packMembers() {
label505:
while(fields.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = fields.DEFAULT_ITERATOR.nextKey();
- Member field = (Member)fields.DEFAULT_ITERATOR.nextValue();
+ Member field = fields.DEFAULT_ITERATOR.nextValue();
if (!Modifiers.isJavaPrivate(field.getModifiers())) {
Type containingType = superclasstype.getContainingTypeOfMember(field);
if (containingType.isClassType()) {
@@ -1640,7 +1624,7 @@ private void packMembers() {
this.data().containingTypesOfMembers.put(field, containingType);
}
} else if (supertype.isClassType()) {
- Object method2;
+ Type method2;
if (supertype.isRawType()) {
method2 = ((ParameterizedType)containingType).getClassType();
} else {
@@ -1648,7 +1632,7 @@ private void packMembers() {
}
if (field.getEnclosingClassType() != method2) {
- this.data().containingTypesOfMembers.put(field, (Type)method2);
+ this.data().containingTypesOfMembers.put(field, method2);
}
} else {
try {
@@ -1656,7 +1640,7 @@ private void packMembers() {
if (field.getEnclosingClassType() != type) {
this.data().containingTypesOfMembers.put(field, type);
}
- } catch (UnknownEntityException var13) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1664,7 +1648,7 @@ private void packMembers() {
this.data().memberFields.DEFAULT_ITERATOR.init(identifier);
while(this.data().memberFields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member memberfield = (Member)this.data().memberFields.DEFAULT_ITERATOR.nextValue();
+ Member memberfield = this.data().memberFields.DEFAULT_ITERATOR.nextValue();
if (memberfield.isExplicitOverriding() && memberfield.getExplicitOverridingType() == this.getContainingTypeOfMember(field)) {
memberfield.declareOverriddenMember(field);
continue label505;
@@ -1674,7 +1658,7 @@ private void packMembers() {
this.data().memberFields.DEFAULT_ITERATOR.init(identifier);
while(this.data().memberFields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member memberfield = (Member)this.data().memberFields.DEFAULT_ITERATOR.nextValue();
+ Member memberfield = this.data().memberFields.DEFAULT_ITERATOR.nextValue();
if (!memberfield.isExplicitOverriding()) {
if (this.haveOverridingFieldModifiers(memberfield, field)) {
memberfield.declareOverriddenMember(field);
@@ -1692,7 +1676,7 @@ private void packMembers() {
this.data().allMemberFields.DEFAULT_ITERATOR.init(identifier);
while(this.data().allMemberFields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member field2 = (Member)this.data().allMemberFields.DEFAULT_ITERATOR.nextValue();
+ Member field2 = this.data().allMemberFields.DEFAULT_ITERATOR.nextValue();
if (field != field2) {
continue label505;
}
@@ -1703,7 +1687,7 @@ private void packMembers() {
this.data().allExplicitMemberFields.DEFAULT_ITERATOR.init(identifier);
while(this.data().allExplicitMemberFields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member field2 = (Member)this.data().allExplicitMemberFields.DEFAULT_ITERATOR.nextValue();
+ Member field2 = this.data().allExplicitMemberFields.DEFAULT_ITERATOR.nextValue();
if (field != field2) {
continue label505;
}
@@ -1718,7 +1702,7 @@ private void packMembers() {
this.data().memberConstructors.DEFAULT_ITERATOR.init();
while(this.data().memberConstructors.DEFAULT_ITERATOR.hasMoreElements()) {
- Member constructor = (Member)this.data().memberConstructors.DEFAULT_ITERATOR.nextKey();
+ Member constructor = this.data().memberConstructors.DEFAULT_ITERATOR.nextKey();
if (canonicEntity != this) {
this.data().containingTypesOfMembers.put(constructor, canonicEntity);
}
@@ -1730,14 +1714,14 @@ private void packMembers() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
if (classtype != this) {
this.space.declareInheritanceDependence(this.file, classtype);
SetOf memberConstructors = classtype.getDeclaredConstructors();
memberConstructors.DEFAULT_ITERATOR.init();
while(memberConstructors.DEFAULT_ITERATOR.hasMoreElements()) {
- Member constructor = (Member)memberConstructors.DEFAULT_ITERATOR.nextKey();
+ Member constructor = memberConstructors.DEFAULT_ITERATOR.nextKey();
if (constructor.getEnclosingClassType() != canonicEntity) {
this.data().containingTypesOfMembers.put(constructor, canonicEntity);
}
@@ -1752,7 +1736,7 @@ private void packMembers() {
while(this.data().memberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = this.data().memberMethods.DEFAULT_ITERATOR.nextKey();
- Member method = (Member)this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
+ Member method = this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
if (method.isExplicitOverriding()) {
this.data().allExplicitMemberMethods.insert(identifier, method);
} else {
@@ -1770,7 +1754,7 @@ private void packMembers() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
if (classtype != this) {
this.space.declareInheritanceDependence(this.file, classtype);
MapOfInt memberMethods = classtype.getDeclaredMemberMethods();
@@ -1778,7 +1762,7 @@ private void packMembers() {
while(memberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = memberMethods.DEFAULT_ITERATOR.nextKey();
- Member method = (Member)memberMethods.DEFAULT_ITERATOR.nextValue();
+ Member method = memberMethods.DEFAULT_ITERATOR.nextValue();
if (!method.isExplicitOverriding()) {
this.data().allMemberMethods.insert(identifier, method);
}
@@ -1825,13 +1809,13 @@ private void packMembers() {
while(explMethods.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = explMethods.DEFAULT_ITERATOR.nextKey();
- Member method = (Member)explMethods.DEFAULT_ITERATOR.nextValue();
+ Member method = explMethods.DEFAULT_ITERATOR.nextValue();
try {
if ((
!this.isInterfaceType()
|| i == this.data().superTypes.size() - 1
- || method.getEnclosingClassType() != this.space.getRootClasstype(this.file,getLanguage())
+ || method.getEnclosingClassType() != this.space.getRootClasstype(this.file)
)
&& !Modifiers.isJavaPrivate(method.getModifiers())) {
Type containingType = superclasstype.getContainingTypeOfMember(method);
@@ -1840,15 +1824,15 @@ private void packMembers() {
this.data().containingTypesOfMembers.put(method, containingType);
}
} else if (supertype.isClassType()) {
- Object type;
+ Type var61;
if (supertype.isRawType()) {
- type = ((ParameterizedType)containingType).getClassType();
+ var61 = ((ParameterizedType)containingType).getClassType();
} else {
- type = containingType;
+ var61 = containingType;
}
- if (method.getEnclosingClassType() != type) {
- this.data().containingTypesOfMembers.put(method, (Type)type);
+ if (method.getEnclosingClassType() != var61) {
+ this.data().containingTypesOfMembers.put(method, var61);
}
} else {
try {
@@ -1856,13 +1840,13 @@ private void packMembers() {
if (method.getEnclosingClassType() != type) {
this.data().containingTypesOfMembers.put(method, type);
}
- } catch (UnknownEntityException var12) {
+ } catch (UnknownEntityException ignored) {
}
}
this.data().allExplicitMemberMethods.insert(identifier, method);
}
- } catch (UnknownEntityException var16) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1872,13 +1856,13 @@ private void packMembers() {
label384:
while(methods.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = methods.DEFAULT_ITERATOR.nextKey();
- Member method = (Member)methods.DEFAULT_ITERATOR.nextValue();
+ Member method = methods.DEFAULT_ITERATOR.nextValue();
try {
if ((
!this.isInterfaceType()
|| i == this.data().superTypes.size() - 1
- || method.getEnclosingClassType() != this.space.getRootClasstype(this.file,getLanguage())
+ || method.getEnclosingClassType() != this.space.getRootClasstype(this.file)
)
&& !Modifiers.isJavaPrivate(method.getModifiers())) {
Type containingType = superclasstype.getContainingTypeOfMember(method);
@@ -1887,7 +1871,7 @@ private void packMembers() {
this.data().containingTypesOfMembers.put(method, containingType);
}
} else if (supertype.isClassType()) {
- Object var69;
+ Type var69;
if (supertype.isRawType()) {
var69 = ((ParameterizedType)containingType).getClassType();
} else {
@@ -1895,7 +1879,7 @@ private void packMembers() {
}
if (method.getEnclosingClassType() != var69) {
- this.data().containingTypesOfMembers.put(method, (Type)var69);
+ this.data().containingTypesOfMembers.put(method, var69);
}
} else {
try {
@@ -1903,7 +1887,7 @@ private void packMembers() {
if (method.getEnclosingClassType() != type) {
this.data().containingTypesOfMembers.put(method, type);
}
- } catch (UnknownEntityException var11) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1911,7 +1895,7 @@ private void packMembers() {
this.data().memberMethods.DEFAULT_ITERATOR.init(identifier);
while(this.data().memberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member membermethod = (Member)this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
+ Member membermethod = this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
if (this.haveMatchingOverrideMethodSignatures(canonicEntity, membermethod, method)
&& membermethod.isExplicitOverriding()
&& membermethod.getExplicitOverridingType() == this.getContainingTypeOfMember(method)) {
@@ -1923,7 +1907,7 @@ private void packMembers() {
this.data().memberMethods.DEFAULT_ITERATOR.init(identifier);
while(this.data().memberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member membermethod = (Member)this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
+ Member membermethod = this.data().memberMethods.DEFAULT_ITERATOR.nextValue();
if (this.haveMatchingOverrideMethodSignatures(canonicEntity, membermethod, method) && !membermethod.isExplicitOverriding()) {
if (this.haveOverridingMethodModifiers(membermethod, method)) {
membermethod.declareOverriddenMember(method);
@@ -1941,7 +1925,7 @@ private void packMembers() {
this.data().allMemberMethods.DEFAULT_ITERATOR.init(identifier);
while(this.data().allMemberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member method2 = (Member)this.data().allMemberMethods.DEFAULT_ITERATOR.nextValue();
+ Member method2 = this.data().allMemberMethods.DEFAULT_ITERATOR.nextValue();
if (method != method2 && this.haveMatchingOverrideMethodSignatures(canonicEntity, method2, method)) {
continue label384;
}
@@ -1952,7 +1936,7 @@ private void packMembers() {
this.data().allExplicitMemberMethods.DEFAULT_ITERATOR.init(identifier);
while(this.data().allExplicitMemberMethods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member method2 = (Member)this.data().allExplicitMemberMethods.DEFAULT_ITERATOR.nextValue();
+ Member method2 = this.data().allExplicitMemberMethods.DEFAULT_ITERATOR.nextValue();
if (method != method2 && this.haveMatchingOverrideMethodSignatures(canonicEntity, method2, method)) {
continue label384;
}
@@ -1961,7 +1945,7 @@ private void packMembers() {
this.data().allMemberMethods.insert(identifier, method);
}
- } catch (UnknownEntityException var15) {
+ } catch (UnknownEntityException ignored) {
}
}
}
@@ -1975,12 +1959,12 @@ private boolean haveMatchingOverrideMethodSignatures(Type type, Member method, M
return false;
} else {
if (method.getMethodParametertypeCount(type) > 0) {
- if (!getLanguage().getTypeSystem().inheritsBoundTypes()) {
+ if (!this.file.getLanguage().getTypeSystem().inheritsBoundTypes()) {
int count = method.getMethodParametertypeCount(type);
for(int i = 0; i < count; ++i) {
- MethodParameterType methodparametertype1 = method.getMethodParametertype(i);
- MethodParameterType methodparametertype2 = overriddenmethod.getMethodParametertype(i);
+ MethodParameterType methodparametertype1 = method.getMethodParameterType(i);
+ MethodParameterType methodparametertype2 = overriddenmethod.getMethodParameterType(i);
int c = methodparametertype1.getBoundTypeCount();
if (c != methodparametertype2.getBoundTypeCount()) {
return false;
@@ -2091,7 +2075,7 @@ private void loadSupertypes() {
this.data().allSuperClasstypes.DEFAULT_ITERATOR.init();
while(this.data().allSuperClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- if (((ClassType)this.data().allSuperClasstypes.DEFAULT_ITERATOR.nextKey()).getAbsoluteParametertypeCount() > 0) {
+ if (this.data().allSuperClasstypes.DEFAULT_ITERATOR.nextKey().getAbsoluteParametertypeCount() > 0) {
mustAnalyze = true;
break;
}
@@ -2121,15 +2105,13 @@ private void packSuperClasstypes() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
if (classtype != this) {
classtype.loadSuperClasstypes();
ListOf superClasstypes = classtype.data().superClasstypes;
if (superClasstypes != null && superClasstypes.size() > 0) {
try {
- if (!superClasstypes.get(0).isInterfaceType() &&
- this.data().superClasstypes.get(0) ==
- this.space.getRootClasstype(this.file,getLanguage())) {
+ if (!superClasstypes.get(0).isInterfaceType() && this.data().superClasstypes.get(0) == this.space.getRootClasstype(this.file)) {
this.data().superClasstypes.set(0, superClasstypes.get(0));
}
} catch (UnknownEntityException ignored) {
@@ -2178,7 +2160,7 @@ private void packSuperClasstypes() {
while(this.data().memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = this.data().memberClasstypes.DEFAULT_ITERATOR.nextKey();
- ClassType classtype = (ClassType)this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().allMemberClasstypes.put(identifier, classtype);
}
@@ -2203,7 +2185,7 @@ private void packSuperTypes() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
if (classtype != this) {
classtype.loadSupertypes();
ListOf superTypes = classtype.data().superTypes;
@@ -2211,8 +2193,7 @@ private void packSuperTypes() {
try {
if (!superTypes.get(0).isInterfaceType()
&& !this.data().superTypes.get(0).isInterfaceType()
- && this.data().superTypes.get(0) ==
- this.space.getRootClasstype(this.file,getLanguage())) {
+ && this.data().superTypes.get(0) == this.space.getRootClasstype(this.file)) {
this.data().superTypes.set(0, superTypes.get(0));
}
} catch (UnknownEntityException ignored) {
@@ -2241,14 +2222,14 @@ private void packSuperTypes() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)types.DEFAULT_ITERATOR.nextKey();
+ Type type = types.DEFAULT_ITERATOR.nextKey();
try {
this.data().allSuperTypes.put(((ParameterizedType)supertype).replaceType(type));
- } catch (UnknownEntityException var10) {
+ } catch (UnknownEntityException ignored) {
}
}
- } else if (((ClassType)supertype).isRawType()) {
+ } else if (supertype.isRawType()) {
this.data().allSuperTypes.put(((ClassType)supertype).getAllSuperClasstypes());
} else {
this.data().allSuperTypes.put(((ClassType)supertype).getAllSuperTypes());
@@ -2276,7 +2257,7 @@ private void packSuperTypes() {
while(members.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = members.DEFAULT_ITERATOR.nextKey();
- Type membertype = (Type)members.DEFAULT_ITERATOR.nextValue();
+ Type membertype = members.DEFAULT_ITERATOR.nextValue();
ClassType memberclasstype;
if (membertype.isParameterizedType()) {
memberclasstype = ((ParameterizedType)membertype).getClassType();
@@ -2288,7 +2269,7 @@ private void packSuperTypes() {
if (supertype.isParameterizedType()) {
try {
this.data().allMemberTypes.insert(identifier, ((ParameterizedType)supertype).replaceType(membertype));
- } catch (UnknownEntityException var9) {
+ } catch (UnknownEntityException ignored) {
}
} else if (membertype.isRawType()) {
this.data().allMemberTypes.insert(identifier, membertype);
@@ -2303,7 +2284,7 @@ private void packSuperTypes() {
while(this.data().memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int identifier = this.data().memberClasstypes.DEFAULT_ITERATOR.nextKey();
- ClassType classtype = (ClassType)this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = this.data().memberClasstypes.DEFAULT_ITERATOR.nextValue();
this.data().allMemberTypes.put(identifier, classtype.parameterizeCanonical());
}
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/CodingStyle.java b/cl/src/main/java/com/apkide/analysis/clm/api/CodingStyle.java
similarity index 87%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/CodingStyle.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/CodingStyle.java
index 865e3f3..55294d4 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/CodingStyle.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/CodingStyle.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public class CodingStyle {
public String fieldPrefix;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Compiler.java b/cl/src/main/java/com/apkide/analysis/clm/api/Compiler.java
similarity index 88%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Compiler.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Compiler.java
index 33e0535..36ac183 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Compiler.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Compiler.java
@@ -1,9 +1,8 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
@@ -15,7 +14,6 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Comparator;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
@@ -86,7 +84,7 @@ protected void store(StoreOutputStream stream) throws IOException {
}
public void compile(SyntaxTree ast, boolean createDebugMetadata, boolean build) {
- CompilerAbstraction compiler = ast.getFile().getLanguage().getCompiler();
+ com.apkide.analysis.clm.Compiler compiler = ast.getFile().getLanguage().getCompiler();
if (compiler == null || !this.model.filespace.isExternallyBuilded(ast.getFile())) {
this.buildRequiredFilesDebug.put(ast.getFile());
this.buildRequiredFilesRelease.put(ast.getFile());
@@ -106,7 +104,7 @@ public void compile(SyntaxTree ast, boolean createDebugMetadata, boolean build)
}
public void setBuildRequiredFile(FileEntry file) {
- CompilerAbstraction compiler = file.getLanguage().getCompiler();
+ com.apkide.analysis.clm.Compiler compiler = file.getLanguage().getCompiler();
if (compiler == null) {
if (this.model.filespace.isDebugBuilded(file)) {
this.buildRequiredFilesDebug.put(file);
@@ -150,8 +148,7 @@ public void cleanDirectories(Set destinationPathsFullClean, Set
if (destinationDir.exists()) {
if (destinationDir.isFile()) {
if (destinationDirectory.toUpperCase(Locale.US).endsWith(".JAR")) {
- if (!destinationDir.delete()) {
- }
+ destinationDir.delete();
new JarOutputStream(new FileOutputStream(destinationDir), new Manifest()).close();
destinationDir.setLastModified(0L);
@@ -169,8 +166,7 @@ public void cleanDirectories(Set destinationPathsFullClean, Set
(new FileTreeWalker() {
@Override
protected void visitFile(String file) {
- if (!new File(file).delete()) {
- }
+ new File(file).delete();
}
@Override
@@ -182,13 +178,14 @@ protected void visitDirectoryFinished(String directory) {
return;
}
- if (absPath.equals(canonPath) && !new File(directory).delete()) {
+ if (absPath.equals(canonPath)) {
+ new File(directory).delete();
}
- } catch (IOException var4) {
+ } catch (IOException ignored) {
}
}
}).walk(absRootPath);
- } catch (IOException var9) {
+ } catch (IOException ignored) {
}
}
}
@@ -201,7 +198,8 @@ protected void visitDirectoryFinished(String directory) {
(new FileTreeWalker() {
@Override
protected void visitFile(String file) {
- if (file.toUpperCase(Locale.US).endsWith(".CLASS") && !new File(file).delete()) {
+ if (file.toUpperCase(Locale.US).endsWith(".CLASS")) {
+ new File(file).delete();
}
}
}).walk(sourceDir.getAbsolutePath());
@@ -249,20 +247,18 @@ public OutputStream getClassfileOutputStream(ClassType sourceclasstype, String c
}
Set destinationpaths = this.model.filespace.getDestinationPaths(sourcefile);
- OutputStream stream = new CachedOutputStream(
+ return new CachedOutputStream(
destinationpaths, relativedirpath, classfilename, sourcefile.getDiskVersion(), sourcefile, classname, isDirectBuild
);
- return stream;
}
public OutputStream getDebugClassfileOutputStream(ClassType sourceclasstype, String classfilename, String classname, boolean isDirectBuild) {
FileEntry sourcefile = sourceclasstype.getFile();
String relativedirpath = sourceclasstype.getNamespace().getFullyQualifiedNameString().replace('.', File.separatorChar) + File.separator;
Set destinationpaths = this.model.filespace.getDestinationPaths(sourcefile);
- OutputStream stream = new CachedOutputStream(
+ return new CachedOutputStream(
destinationpaths, relativedirpath, classfilename, sourcefile.getDiskVersion(), sourcefile, classname, isDirectBuild
);
- return stream;
}
public OutputStream getSyntheticClassfileOutputStream(ClassType sourceclasstype, String classname, boolean isDirectBuild) {
@@ -273,8 +269,7 @@ public OutputStream getSyntheticClassfileOutputStream(ClassType sourceclasstype,
for(String destinationpath : destinationpaths) {
String filepath = destinationpath + File.separator + classfilename;
if (!this.compiledfilechecksums.containsKey(filepath)) {
- OutputStream stream = new CachedOutputStream(destinationpaths, "", classfilename, 0L, sourcefile, classname, isDirectBuild);
- return stream;
+ return new CachedOutputStream(destinationpaths, "", classfilename, 0L, sourcefile, classname, isDirectBuild);
}
}
@@ -374,46 +369,44 @@ private void writeCache(boolean compressJars) throws IOException {
filepaths.add(enumeration.nextElement());
}
- Collections.sort(filepaths, new Comparator() {
- public int compare(String a, String b) {
- int alen = a.length() - 6;
- int blen = b.length() - 6;
- int length = alen < blen ? alen : blen;
-
- for(int i = 0; i < length; ++i) {
- char achar = a.charAt(i);
- char bchar = b.charAt(i);
- if (achar == '$' && achar != bchar) {
- return -1;
- }
-
- if (bchar == '$' && achar != bchar) {
- return 1;
- }
+ filepaths.sort((a, b) -> {
+ int alen = a.length() - 6;
+ int blen = b.length() - 6;
+ int length = Math.min(alen, blen);
- if (achar == '+' && achar != bchar) {
- return -1;
- }
+ for (int i = 0; i < length; ++i) {
+ char achar = a.charAt(i);
+ char bchar = b.charAt(i);
+ if (achar == '$' && achar != bchar) {
+ return -1;
+ }
- if (bchar == '+' && achar != bchar) {
- return 1;
- }
+ if (bchar == '$' && achar != bchar) {
+ return 1;
+ }
- int diff = achar - bchar;
- if (diff < 0) {
- return -1;
- }
+ if (achar == '+' && achar != bchar) {
+ return -1;
+ }
- if (diff > 0) {
- return 1;
- }
+ if (bchar == '+' && achar != bchar) {
+ return 1;
}
- if (alen < blen) {
+ int diff = achar - bchar;
+ if (diff < 0) {
return -1;
- } else {
- return alen > blen ? 1 : 0;
}
+
+ if (diff > 0) {
+ return 1;
+ }
+ }
+
+ if (alen < blen) {
+ return -1;
+ } else {
+ return alen > blen ? 1 : 0;
}
});
Set destinationDirs = new HashSet<>();
@@ -478,10 +471,9 @@ public int compare(String a, String b) {
}
} else {
try {
- JarInputStream jarcompin = new JarInputStream(new FileInputStream(destinationpath));
- try {
- while(true) {
+ try (JarInputStream jarcompin = new JarInputStream(new FileInputStream(destinationpath))) {
+ while (true) {
JarEntry entry = jarcompin.getNextJarEntry();
if (entry == null) {
break;
@@ -489,15 +481,13 @@ public int compare(String a, String b) {
String entrypath = destinationpath + entry.getName().replace('/', File.separatorChar);
if (!entrypath.endsWith(".class")
- && this.cachedsourcefileversions.containsKey(entrypath)
- && entry.getTime() / 2000L * 2000L >= this.cachedsourcefileversions.get(entrypath)) {
+ && this.cachedsourcefileversions.containsKey(entrypath)
+ && entry.getTime() / 2000L * 2000L >= this.cachedsourcefileversions.get(entrypath)) {
this.cachedfilecontents.remove(entrypath);
}
jarcompin.closeEntry();
}
- } finally {
- jarcompin.close();
}
enumeration = this.cachedfilecontents.keys();
@@ -525,7 +515,7 @@ public int compare(String a, String b) {
try {
JarOutputStream out = new JarOutputStream(new FileOutputStream(destinationpath), new Manifest());
out.close();
- } catch (IOException var43) {
+ } catch (IOException ignored) {
}
}
@@ -534,10 +524,8 @@ public int compare(String a, String b) {
jarout.setLevel(0);
}
- JarInputStream jarin = new JarInputStream(new FileInputStream(destinationpath));
-
- try {
- while(true) {
+ try (JarInputStream jarin = new JarInputStream(new FileInputStream(destinationpath))) {
+ while (true) {
JarEntry entry = jarin.getNextJarEntry();
if (entry == null) {
break;
@@ -548,7 +536,7 @@ public int compare(String a, String b) {
this.cachedfilecontents.remove(entrypath);
jarout.putNextEntry(entry);
- while(true) {
+ while (true) {
int c = jarin.read(this.copybuffer);
if (c == -1) {
jarout.closeEntry();
@@ -561,8 +549,6 @@ public int compare(String a, String b) {
jarin.closeEntry();
}
- } finally {
- jarin.close();
}
try {
@@ -580,7 +566,7 @@ public int compare(String a, String b) {
}
this.cachedsourcefileversions.remove(filepathx);
- String entryname = filepathx.substring(destinationpath.length() + 1, filepathx.length()).replace(File.separatorChar, '/');
+ String entryname = filepathx.substring(destinationpath.length() + 1).replace(File.separatorChar, '/');
JarEntry entry = new JarEntry(entryname);
entry.setTime(cachedsourceversion);
jarout.putNextEntry(entry);
@@ -624,7 +610,7 @@ private boolean destinationContainsJars() {
return false;
}
- private class CachedFileContent implements FileContent {
+ private static class CachedFileContent implements FileContent {
private byte[] bytes;
private int pos;
@@ -733,7 +719,7 @@ public void close() throws IOException {
}
if (content == null) {
- content = Compiler.this.new CachedFileContent();
+ content = new CachedFileContent();
}
content.fillWith(this.buffer, this.bufferpos);
@@ -754,7 +740,7 @@ public void close() throws IOException {
}
if (content == null) {
- content = Compiler.this.new CachedFileContent();
+ content = new CachedFileContent();
}
content.fillWith(this.buffer, this.bufferpos);
@@ -793,7 +779,7 @@ private boolean ondisk(String destinationpath) throws IOException {
}
private interface FileContent {
- void flushInto(OutputStream var1) throws IOException;
+ void flushInto(OutputStream stream) throws IOException;
}
private static class FileTreeWalker {
@@ -811,28 +797,24 @@ protected void visitDirectoryFinished(String directory) {
public void walk(String fileOrDirectory) {
String name = fileOrDirectory.trim();
- if (name.endsWith(":") && name.indexOf("\\") == -1) {
+ if (name.endsWith(":") && !name.contains("\\")) {
fileOrDirectory = name + "\\";
}
File entry = new File(fileOrDirectory);
- if (entry != null) {
- if (entry.isDirectory()) {
- if (fileOrDirectory != null) {
- this.visitDirectory(fileOrDirectory);
- }
- } else if (entry.isFile() && fileOrDirectory != null) {
- this.visitFile(fileOrDirectory);
- }
-
- String[] files = entry.list();
- if (files != null) {
- for(int i = 0; i < files.length; ++i) {
- this.walk(fileOrDirectory + File.separator + files[i]);
- }
+ if (entry.isDirectory()) {
+ this.visitDirectory(fileOrDirectory);
+ } else if (entry.isFile()) {
+ this.visitFile(fileOrDirectory);
+ }
- this.visitDirectoryFinished(fileOrDirectory);
+ String[] files = entry.list();
+ if (files != null) {
+ for (String file : files) {
+ this.walk(fileOrDirectory + File.separator + file);
}
+
+ this.visitDirectoryFinished(fileOrDirectory);
}
}
}
@@ -863,7 +845,7 @@ public void flushInto(OutputStream stream) throws IOException {
in.close();
Compiler.this.buffercache1 = readbuffer;
- } catch (IOException var5) {
+ } catch (IOException ignored) {
}
}
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/Entity.java b/cl/src/main/java/com/apkide/analysis/clm/api/Entity.java
new file mode 100644
index 0000000..b6a9391
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Entity.java
@@ -0,0 +1,177 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+
+public abstract class Entity {
+ private final EntitySpace mySpace;
+
+ public Entity(EntitySpace space) {
+ this.mySpace = space;
+ }
+
+ protected void load(StoreInputStream stream) throws IOException {
+ }
+
+ protected void store(StoreOutputStream stream) throws IOException {
+ }
+
+ public boolean isPrivateVisibleFrom(Entity entity) {
+ if (this.getFile() != entity.getFile()) {
+ return false;
+ } else {
+ return getEnclosingClassType().isEnclosedBy(entity.getEnclosingClassType());
+ }
+ }
+
+ public String getHTMLString() {
+ return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getHTMLString(this) : "";
+ }
+
+ public int getIdentifier() {
+ return 0;
+ }
+
+ public boolean isType() {
+ return this instanceof Type;
+ }
+
+ public boolean isNamespace() {
+ return this instanceof Namespace;
+ }
+
+ public boolean isMethodParameterTypeVariable() {
+ return this instanceof MethodParameterTypeVariable;
+ }
+
+ public boolean isMember() {
+ return this instanceof Member;
+ }
+
+ public boolean isArrayType() {
+ return this instanceof ArrayType;
+ }
+
+ public boolean isPointerType() {
+ return this instanceof PointerType;
+ }
+
+ public boolean isPrimitiveType() {
+ return this instanceof PrimitiveType;
+ }
+
+ public boolean isClassType() {
+ return this instanceof ClassType;
+ }
+
+ public boolean isParameterType() {
+ return this instanceof ParameterType;
+ }
+
+ public boolean isMethodParameterType() {
+ return this instanceof MethodParameterType;
+ }
+
+ public boolean isParameterizedType() {
+ return this instanceof ParameterizedType;
+ }
+
+ public int getID() {
+ return 0;
+ }
+
+ public int getModifiers() {
+ return 0;
+ }
+
+ public boolean isPrivate() {
+ return Modifiers.isJavaPrivate(this.getModifiers()) || Modifiers.isCSPrivate(this.getModifiers());
+ }
+
+ public boolean isFilePrivate() {
+ return this.isPrivate();
+ }
+
+ public ClassType getEnclosingClassType() {
+ return null;
+ }
+
+ public Language getLanguage() {
+ return this.getFile().getLanguage();
+ }
+
+ public ClassType getEnclosingTopLevelClassType() {
+ return null;
+ }
+
+ public String getDocumentationString() {
+ return this.mySpace.getDocumentationString(this);
+ }
+
+ public String getHTMLDocumentationString() {
+ return this.mySpace.getHTMLDocumentationString(this);
+ }
+
+ public FileEntry getFile() {
+ return null;
+ }
+
+ public int getDeclarationNumber() {
+ return -1;
+ }
+
+ public String getFullyQualifiedNameString() {
+ return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getFullyQualifiedNameString(this) : "";
+ }
+
+ public String getNameString() {
+ return this.getLanguage().getRenderer() != null ? this.getLanguage().getRenderer().getNameString(this) : "";
+ }
+
+ public int getIdentifierLine() {
+ return 0;
+ }
+
+ public int getIdentifierEndColumn() {
+ return 0;
+ }
+
+ public int getIdentifierStartColumn() {
+ return 0;
+ }
+
+ public int getModifiersStartLine() {
+ return 0;
+ }
+
+ public int getModifiersEndLine() {
+ return 0;
+ }
+
+ public int getModifiersEndColumn() {
+ return 0;
+ }
+
+ public int getModifiersStartColumn() {
+ return 0;
+ }
+
+ public int getEndColumn() {
+ return 0;
+ }
+
+ public int getEndLine() {
+ return 0;
+ }
+
+ public int getStartColumn() {
+ return 0;
+ }
+
+ public int getStartLine() {
+ return 0;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/EntitySpace.java b/cl/src/main/java/com/apkide/analysis/clm/api/EntitySpace.java
similarity index 80%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/EntitySpace.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/EntitySpace.java
index b7298f0..ff06e02 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/EntitySpace.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/EntitySpace.java
@@ -1,61 +1,28 @@
-package com.apkide.analysis.api.clm;
-
-
-import static com.apkide.analysis.api.clm.Operators.AND;
-import static com.apkide.analysis.api.clm.Operators.CONDAND;
-import static com.apkide.analysis.api.clm.Operators.CONDOR;
-import static com.apkide.analysis.api.clm.Operators.DIV;
-import static com.apkide.analysis.api.clm.Operators.EQUAL;
-import static com.apkide.analysis.api.clm.Operators.GREATER;
-import static com.apkide.analysis.api.clm.Operators.GREATEROREQUAL;
-import static com.apkide.analysis.api.clm.Operators.LESS;
-import static com.apkide.analysis.api.clm.Operators.LESSOREQUAL;
-import static com.apkide.analysis.api.clm.Operators.LSHIFT;
-import static com.apkide.analysis.api.clm.Operators.MINUS;
-import static com.apkide.analysis.api.clm.Operators.NOT;
-import static com.apkide.analysis.api.clm.Operators.NOTEQUAL;
-import static com.apkide.analysis.api.clm.Operators.OR;
-import static com.apkide.analysis.api.clm.Operators.PLUS;
-import static com.apkide.analysis.api.clm.Operators.REMAINDER;
-import static com.apkide.analysis.api.clm.Operators.RSIGNEDSHIFT;
-import static com.apkide.analysis.api.clm.Operators.RUNSIGNEDSHIFT;
-import static com.apkide.analysis.api.clm.Operators.STAR;
-import static com.apkide.analysis.api.clm.Operators.TILDE;
-import static com.apkide.analysis.api.clm.Operators.XOR;
-import static com.apkide.analysis.api.clm.TypeSemantic.BOOL_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.CHAR16_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.FLOAT32_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.FLOAT64_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.INT16_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.INT32_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.INT64_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.INT8_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.UINT16_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.UINT32_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.UINT64_SEMANTIC;
-import static com.apkide.analysis.api.clm.TypeSemantic.UINT8_SEMANTIC;
-
-import com.apkide.analysis.api.cle.Language;
-import com.apkide.analysis.api.clm.callback.StopCallback;
-import com.apkide.analysis.api.clm.collections.MapOf;
-import com.apkide.analysis.api.clm.collections.MapOfInt;
-import com.apkide.analysis.api.clm.collections.RelationOfIntInt;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.FunctionOfIntInt;
-import com.apkide.common.collections.ListOfInt;
-import com.apkide.common.collections.MapOfIntArrayInt;
-import com.apkide.common.collections.MapOfIntInt;
-import com.apkide.common.collections.MapOfIntLong;
-import com.apkide.common.collections.MapOfLongInt;
-import com.apkide.common.collections.SetOfInt;
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.callback.StopCallback;
+import com.apkide.analysis.clm.api.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
+import com.apkide.analysis.clm.api.collections.MapOf;
+import com.apkide.analysis.clm.api.collections.MapOfInt;
+import com.apkide.analysis.clm.api.collections.MapOfIntArrayInt;
+import com.apkide.analysis.clm.api.collections.MapOfIntInt;
+import com.apkide.analysis.clm.api.collections.MapOfIntLong;
+import com.apkide.analysis.clm.api.collections.MapOfLongInt;
+import com.apkide.analysis.clm.api.collections.RelationOfIntInt;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
import java.io.IOException;
public class EntitySpace {
+ private static final boolean DEBUG_UPDATE = false;
+ private static final boolean DEBUG_LOAD = false;
private static final long MAX_MEMSIZE = 6000000L;
private final FileSpace filespace;
private final SyntaxTreeSpace trees;
@@ -100,9 +67,9 @@ public EntitySpace(IdentifierSpace identifiers, FileSpace filespace, SyntaxTreeS
protected void shrink(boolean full) {
int memSize = 0;
- for(int fileid = 0; fileid < this.fileInfos.length; ++fileid) {
- if (this.fileInfos[fileid] != null) {
- memSize += this.fileInfos[fileid].memSize();
+ for (FileInfo info : this.fileInfos) {
+ if (info != null) {
+ memSize += info.memSize();
}
}
@@ -110,7 +77,7 @@ protected void shrink(boolean full) {
if (full) {
allowedMemsize = 0L;
} else {
- allowedMemsize = MAX_MEMSIZE;
+ allowedMemsize = 6000000L;
}
if ((long)memSize > allowedMemsize) {
@@ -200,7 +167,7 @@ protected void storeEntries(StoreOutputStream stream) throws IOException {
stream.writeByte(8);
} else if (this.getEntity(i).isParameterizedType()) {
stream.writeByte(9);
- } else if (this.getEntity(i).isMethodParametertypeVariable()) {
+ } else if (this.getEntity(i).isMethodParameterTypeVariable()) {
stream.writeByte(10);
} else if (this.getEntity(i).isPointerType()) {
stream.writeByte(11);
@@ -228,7 +195,7 @@ protected void loadEntries(StoreInputStream stream) throws IOException {
this.entities[i] = new ClassType(this, this.filespace, this.identifiers);
break;
case 4:
- this.entities[i] = new ArrayType(filespace,this);
+ this.entities[i] = new ArrayType(this);
break;
case 6:
this.entities[i] = new Namespace(this, this.identifiers, this.filespace);
@@ -240,13 +207,13 @@ protected void loadEntries(StoreInputStream stream) throws IOException {
this.entities[i] = new ParameterType(this, this.identifiers, this.filespace);
break;
case 9:
- this.entities[i] = new ParameterizedType(filespace,this);
+ this.entities[i] = new ParameterizedType(this);
break;
case 10:
- this.entities[i] = new MethodParametertypeVariable(filespace,this);
+ this.entities[i] = new MethodParameterTypeVariable(this);
break;
case 11:
- this.entities[i] = new PointerType(filespace,this);
+ this.entities[i] = new PointerType(this);
break;
case 12:
this.entities[i] = new PrimitiveType(this, this.filespace);
@@ -288,10 +255,10 @@ protected void store(StoreOutputStream stream) throws IOException {
this.fileinheritancedependences.store(stream);
stream.writeInt(this.fileInfos.length);
- for(int i = 0; i < this.fileInfos.length; ++i) {
- stream.writeBoolean(this.fileInfos[i] != null);
- if (this.fileInfos[i] != null) {
- this.fileInfos[i].store(stream);
+ for (FileInfo fileInfo : this.fileInfos) {
+ stream.writeBoolean(fileInfo != null);
+ if (fileInfo != null) {
+ fileInfo.store(stream);
}
}
@@ -407,9 +374,9 @@ protected void invalidateAll() {
this.allClasstypes = null;
- for(int fileid = 0; fileid < this.fileInfos.length; ++fileid) {
- if (this.fileInfos[fileid] != null) {
- this.fileInfos[fileid].invalidate();
+ for (FileInfo fileInfo : this.fileInfos) {
+ if (fileInfo != null) {
+ fileInfo.invalidate();
}
}
@@ -470,7 +437,7 @@ public MapOf getAllClasstypes(int identifier, int argCount
this.allClasstypes.DEFAULT_ITERATOR.init(identifier);
while(this.allClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)this.allClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = this.allClasstypes.DEFAULT_ITERATOR.nextValue();
if (classtype.isReferable(referingFile) && classtype.isApplicable(referingFile, argCount)) {
classtypes.insert(classtype, classtype.getNamespace());
}
@@ -506,7 +473,7 @@ public MapOfInt getAllClasstypes(FileEntry referingFile) {
while(this.allClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
int id = this.allClasstypes.DEFAULT_ITERATOR.nextKey();
- ClassType classtype = (ClassType)this.allClasstypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = this.allClasstypes.DEFAULT_ITERATOR.nextValue();
if (classtype.isReferable(referingFile)) {
classtypes.insert(id, classtype);
}
@@ -529,8 +496,8 @@ private void loadAllClasstypes() {
types.DEFAULT_ITERATOR.init();
while(types.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)types.DEFAULT_ITERATOR.nextKey();
- Namespace namespace = (Namespace)types.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = types.DEFAULT_ITERATOR.nextKey();
+ Namespace namespace = types.DEFAULT_ITERATOR.nextValue();
this.allClasstypes.insert(this.getFileInfo(file).getIdentifierOfClasstype(classtype), classtype);
}
}
@@ -556,7 +523,7 @@ public void declareFileClasstype(FileEntry file, Namespace pakage, int identifie
classtype.declareSyntax(pakage, identifier, module, typeParameterCount);
this.declarePackage(pakage, file);
this.getFileInfo(file).declareToplevelClasstype(pakage, classtype, identifier);
- } catch (UnknownEntityException var7) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -725,7 +692,7 @@ public ClassType declareLocalClasstype(
public ClassType declareAnonymousClasstype(
FileEntry file, int declarationNumber, Namespace pakage, ClassType enclosingClassType, boolean inStaticMethod, boolean hasDocumentation
) {
- int identifier = this.identifiers.get(declarationNumber + "");
+ int identifier = this.identifiers.get(String.valueOf(declarationNumber));
ClassType classtype = this.getFileInfo(file).declareClasstype(declarationNumber, pakage, identifier);
classtype.declareSyntax(
identifier,
@@ -878,11 +845,11 @@ public void declareSyntaxOfMethodParameter(Member method, int modifiers, int ide
}
public void declareBoundtype(MethodParameterType methodparametertype, Type boundtype) {
- methodparametertype.declareBoundtype(boundtype);
+ methodparametertype.declareBoundType(boundtype);
}
public void declareBoundtype(ParameterType parametertype, Type boundtype) {
- parametertype.declareBoundtype(boundtype);
+ parametertype.declareBoundType(boundtype);
}
public void declareMemberPositions(
@@ -1101,7 +1068,7 @@ public Type getParameterizedtype(ClassType classtype, Type[] absoluteargumenttyp
absoluteargumentvariances[ix] = 0;
try {
- absoluteargumenttypes[ix] = this.getRootClasstype(classtype.getFile(), classtype.getLanguage());
+ absoluteargumenttypes[ix] = this.getRootClasstype(classtype.getFile());
} catch (UnknownEntityException ignored) {
}
}
@@ -1117,7 +1084,7 @@ public Type getParameterizedtype(ClassType classtype, Type[] absoluteargumenttyp
);
}
- ParameterizedType p = new ParameterizedType(filespace,this, classtype, absoluteargumenttypes, absoluteargumentvariances);
+ ParameterizedType p = new ParameterizedType(this, classtype, absoluteargumenttypes, absoluteargumentvariances);
this.parameterizedTypes.put(classtype.getID(), this.absoluteargumentids, absoluteargumentvariances, 0, absolutelen, p.getID());
return p;
}
@@ -1126,12 +1093,12 @@ public Type getParameterizedtype(ClassType classtype, Type[] absoluteargumenttyp
return classtype;
}
- public MethodParametertypeVariable getMethodParametertypeVariableFor(MethodParameterType methodparametertype) {
+ public MethodParameterTypeVariable getMethodParametertypeVariableFor(MethodParameterType methodparametertype) {
if (!this.methodParametertypeVariables.contains(methodparametertype.getID())) {
- this.methodParametertypeVariables.put(methodparametertype.getID(), new MethodParametertypeVariable(filespace,this, methodparametertype).getID());
+ this.methodParametertypeVariables.put(methodparametertype.getID(), new MethodParameterTypeVariable(this, methodparametertype).getID());
}
- return (MethodParametertypeVariable)this.getEntity(this.methodParametertypeVariables.get(methodparametertype.getID()));
+ return (MethodParameterTypeVariable)this.getEntity(this.methodParametertypeVariables.get(methodparametertype.getID()));
}
public PointerType getPointertype(Type type) {
@@ -1139,7 +1106,7 @@ public PointerType getPointertype(Type type) {
if (this.pointerTypes.contains(typeentity)) {
return (PointerType)this.getEntity(this.pointerTypes.get(typeentity));
} else {
- PointerType p = new PointerType(filespace,this, type);
+ PointerType p = new PointerType(this, type);
this.pointerTypes.put(typeentity, p.getID());
return p;
}
@@ -1150,7 +1117,7 @@ public ArrayType getArraytype(Type type, int dimension) {
if (this.arrayTypes.contains(key)) {
return (ArrayType)this.getEntity(this.arrayTypes.get(key));
} else {
- ArrayType a = new ArrayType(filespace,this, type, dimension);
+ ArrayType a = new ArrayType(this, type, dimension);
this.arrayTypes.put(key, a.getID());
return a;
}
@@ -1167,12 +1134,12 @@ public PrimitiveType getPrimitivetype(Language language, int number) {
}
}
- public ClassType getArraySuperClasstype(FileEntry file, Language language) throws UnknownEntityException {
- return language.getTypeSystem().getArraySuperClasstype(file);
+ public ClassType getArraySuperClasstype(FileEntry file) throws UnknownEntityException {
+ return file.getLanguage().getTypeSystem().getArraySuperClasstype(file);
}
- public ClassType getRootClasstype(FileEntry file, Language language) throws UnknownEntityException {
- return language.getTypeSystem().getRootClasstype(file);
+ public ClassType getRootClasstype(FileEntry file) throws UnknownEntityException {
+ return file.getLanguage().getTypeSystem().getRootClasstype(file);
}
public long encodeBoolean(boolean b) {
@@ -1192,7 +1159,7 @@ public double decodeDouble(long value) {
}
public long encodeFloat(float f) {
- return (long)Float.floatToIntBits(f);
+ return Float.floatToIntBits(f);
}
public float decodeFloat(long value) {
@@ -1200,7 +1167,7 @@ public float decodeFloat(long value) {
}
public long encodeInt(int i) {
- return (long)i;
+ return i;
}
public int decodeInt(long value) {
@@ -1224,154 +1191,154 @@ public long foldConversion(FileEntry file, long value, Type fromtype, Type totyp
return this.foldConversion(file, value, fromtype, ((ClassType)totype.getErasedType()).getEnumBaseType(file));
} else {
switch(totype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
+ case 3:
+ case 4:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeInt((byte)this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeInt((byte)((int)this.decodeLong(value)));
- case BOOL_SEMANTIC:
+ case 11:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeInt((byte)((int)this.decodeFloat(value)));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeInt((byte)((int)this.decodeDouble(value)));
}
- case INT16_SEMANTIC:
+ case 5:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeInt((short)this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeInt((short)((int)this.decodeLong(value)));
- case BOOL_SEMANTIC:
+ case 11:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeInt((short)((int)this.decodeFloat(value)));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeInt((short)((int)this.decodeDouble(value)));
}
- case UINT16_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 6:
+ case 12:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeInt((char)this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeInt((char)((int)this.decodeLong(value)));
- case BOOL_SEMANTIC:
+ case 11:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeInt((char)((int)this.decodeFloat(value)));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeInt((char)((int)this.decodeDouble(value)));
}
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return value;
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeInt((int)this.decodeLong(value));
- case BOOL_SEMANTIC:
+ case 11:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeInt((int)this.decodeFloat(value));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeInt((int)this.decodeDouble(value));
}
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeLong(this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 9:
+ case 10:
+ case 11:
default:
break;
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeLong((long)this.decodeFloat(value));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeLong((long)this.decodeDouble(value));
}
- case BOOL_SEMANTIC:
+ case 11:
default:
break;
- case FLOAT32_SEMANTIC:
+ case 13:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeFloat((float)this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeFloat((float)this.decodeLong(value));
- case BOOL_SEMANTIC:
- case FLOAT32_SEMANTIC:
+ case 11:
+ case 13:
default:
throw new UnknownEntityException();
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeFloat((float)this.decodeDouble(value));
}
- case FLOAT64_SEMANTIC:
+ case 14:
switch(fromtype.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeDouble(this.decodeInt(value));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeDouble((double)this.decodeLong(value));
- case BOOL_SEMANTIC:
+ case 11:
default:
break;
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeDouble(this.decodeFloat(value));
}
}
@@ -1382,47 +1349,47 @@ public long foldConversion(FileEntry file, long value, Type fromtype, Type totyp
public long foldUnaryOperation(FileEntry file, int operator, long value, Type type) throws UnknownEntityException {
switch(operator) {
- case PLUS:
+ case 1:
return value;
- case MINUS:
+ case 2:
switch(type.getSemantic()) {
- case INT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 5:
+ case 7:
+ case 12:
return this.encodeInt(-this.decodeInt(value));
- case UINT8_SEMANTIC:
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
+ case 9:
return this.encodeLong(-this.decodeLong(value));
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(-this.decodeFloat(value));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(-this.decodeDouble(value));
}
- case TILDE:
+ case 20:
switch(type.getSemantic()) {
- case INT8_SEMANTIC:
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case UINT16_SEMANTIC:
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 12:
return this.encodeInt(~this.decodeInt(value));
- case INT64_SEMANTIC:
+ case 9:
return this.encodeLong(~this.decodeLong(value));
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
}
- case NOT:
+ case 21:
return this.encodeBoolean(!this.decodeBoolean(value));
default:
throw new UnknownEntityException();
@@ -1431,8 +1398,8 @@ public long foldUnaryOperation(FileEntry file, int operator, long value, Type ty
public long foldBinaryOperation(FileEntry file, int operator, long value1, long value2, Type type1, Type type2) throws UnknownEntityException {
try {
- switch (operator) {
- case PLUS: {
+ switch(operator) {
+ case 1: {
if (type1.isEnumType()) {
return this.foldBinaryOperation(
file,
@@ -1448,158 +1415,158 @@ public long foldBinaryOperation(FileEntry file, int operator, long value1, long
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) + this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) + this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(this.decodeFloat(pv1) + this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(this.decodeDouble(pv1) + this.decodeDouble(pv2));
}
}
- case MINUS: {
+ case 2: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) - this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) - this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(this.decodeFloat(pv1) - this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(this.decodeDouble(pv1) - this.decodeDouble(pv2));
}
}
- case DIV: {
+ case 3: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) / this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) / this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(this.decodeFloat(pv1) / this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(this.decodeDouble(pv1) / this.decodeDouble(pv2));
}
}
- case REMAINDER: {
+ case 4: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) % this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) % this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(this.decodeFloat(pv1) % this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(this.decodeDouble(pv1) % this.decodeDouble(pv2));
}
}
- case STAR: {
+ case 5: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) * this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) * this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeFloat(this.decodeFloat(pv1) * this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeDouble(this.decodeDouble(pv1) * this.decodeDouble(pv2));
}
}
- case OR: {
+ case 6: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) | this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) | this.decodeLong(pv2));
- case BOOL_SEMANTIC:
+ case 11:
return this.encodeBoolean(this.decodeBoolean(pv1) | this.decodeBoolean(pv2));
default:
throw new UnknownEntityException();
}
}
- case AND: {
+ case 7: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) & this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) & this.decodeLong(pv2));
- case BOOL_SEMANTIC:
+ case 11:
return this.encodeBoolean(this.decodeBoolean(pv1) & this.decodeBoolean(pv2));
default:
throw new UnknownEntityException();
}
}
- case XOR: {
+ case 8: {
Type resulttype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, resulttype);
long pv2 = this.foldConversion(file, value2, type2, resulttype);
switch (resulttype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeInt(this.decodeInt(pv1) ^ this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeLong(this.decodeLong(pv1) ^ this.decodeLong(pv2));
- case BOOL_SEMANTIC:
+ case 11:
return this.encodeBoolean(this.decodeBoolean(pv1) ^ this.decodeBoolean(pv2));
default:
throw new UnknownEntityException();
}
}
- case EQUAL: {
+ case 9: {
Type operationtype;
if (type1 == type2) {
operationtype = type1;
@@ -1612,279 +1579,280 @@ public long foldBinaryOperation(FileEntry file, int operator, long value1, long
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) == this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) == this.decodeLong(pv2));
- case BOOL_SEMANTIC:
+ case 11:
return this.encodeBoolean(this.decodeBoolean(pv1) == this.decodeBoolean(pv2));
- case CHAR16_SEMANTIC:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) == this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) == this.decodeDouble(pv2));
}
}
- case NOTEQUAL: {
+ case 10: {
Type operationtype;
- if (type1 == type2)
+ if (type1 == type2) {
operationtype = type1;
- else if (type1.isExplicitConvertibleTo(file, type2))
+ } else if (type1.isExplicitConvertibleTo(file, type2)) {
operationtype = type2;
- else
+ } else {
operationtype = type1;
+ }
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) != this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) != this.decodeLong(pv2));
- case BOOL_SEMANTIC:
+ case 11:
return this.encodeBoolean(this.decodeBoolean(pv1) != this.decodeBoolean(pv2));
- case CHAR16_SEMANTIC:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) != this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) != this.decodeDouble(pv2));
}
}
- case LESS: {
+ case 11: {
Type operationtype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) < this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) < this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) < this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) < this.decodeDouble(pv2));
}
}
- case LESSOREQUAL: {
+ case 12: {
Type operationtype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) <= this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) <= this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) <= this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) <= this.decodeDouble(pv2));
}
}
- case GREATER: {
+ case 13: {
Type operationtype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) > this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) > this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) > this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) > this.decodeDouble(pv2));
}
}
- case GREATEROREQUAL: {
+ case 14: {
Type operationtype = file.getLanguage().getTypeSystem().getBinaryNumericOperationType(file, operator, type1, type2);
long pv1 = this.foldConversion(file, value1, type1, operationtype);
long pv2 = this.foldConversion(file, value2, type2, operationtype);
switch (operationtype.getSemantic()) {
- case INT32_SEMANTIC:
- case UINT32_SEMANTIC:
+ case 7:
+ case 8:
return this.encodeBoolean(this.decodeInt(pv1) >= this.decodeInt(pv2));
- case INT64_SEMANTIC:
- case UINT64_SEMANTIC:
+ case 9:
+ case 10:
return this.encodeBoolean(this.decodeLong(pv1) >= this.decodeLong(pv2));
- case BOOL_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 11:
+ case 12:
default:
throw new UnknownEntityException();
- case FLOAT32_SEMANTIC:
+ case 13:
return this.encodeBoolean(this.decodeFloat(pv1) >= this.decodeFloat(pv2));
- case FLOAT64_SEMANTIC:
+ case 14:
return this.encodeBoolean(this.decodeDouble(pv1) >= this.decodeDouble(pv2));
}
}
- case CONDOR:
+ case 15:
return this.encodeBoolean(this.decodeBoolean(value1) || this.decodeBoolean(value2));
- case CONDAND:
+ case 16:
return this.encodeBoolean(this.decodeBoolean(value1) && this.decodeBoolean(value2));
- case LSHIFT:
- switch (type2.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- switch (type1.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 17:
+ switch(type2.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
+ switch(type1.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
return this.encodeInt(this.decodeInt(value1) << this.decodeInt(value2));
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
+ case 9:
return this.encodeLong(this.decodeLong(value1) << this.decodeInt(value2));
}
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
- switch (type1.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- return this.encodeInt(this.decodeInt(value1) << (int) this.decodeLong(value2));
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 9:
+ switch(type1.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
+ return this.encodeInt(this.decodeInt(value1) << (int)this.decodeLong(value2));
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
- return this.encodeLong(this.decodeLong(value1) << (int) this.decodeLong(value2));
+ case 9:
+ return this.encodeLong(this.decodeLong(value1) << (int)this.decodeLong(value2));
}
}
- case RSIGNEDSHIFT:
- switch (type2.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- switch (type1.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 18:
+ switch(type2.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
+ switch(type1.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
return this.encodeInt(this.decodeInt(value1) >> this.decodeInt(value2));
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
+ case 9:
return this.encodeLong(this.decodeLong(value1) >> this.decodeInt(value2));
}
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
- switch (type1.getSemantic()) {
- case UINT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- return this.encodeInt(this.decodeInt(value1) >> (int) this.decodeLong(value2));
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 9:
+ switch(type1.getSemantic()) {
+ case 4:
+ case 5:
+ case 7:
+ case 12:
+ return this.encodeInt(this.decodeInt(value1) >> (int)this.decodeLong(value2));
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
throw new UnknownEntityException();
- case INT64_SEMANTIC:
- return this.encodeLong(this.decodeLong(value1) >> (int) this.decodeLong(value2));
+ case 9:
+ return this.encodeLong(this.decodeLong(value1) >> (int)this.decodeLong(value2));
}
}
- case RUNSIGNEDSHIFT:
- switch (type2.getSemantic()) {
- case INT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- switch (type1.getSemantic()) {
- case INT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
+ case 19:
+ switch(type2.getSemantic()) {
+ case 3:
+ case 5:
+ case 7:
+ case 12:
+ switch(type1.getSemantic()) {
+ case 3:
+ case 5:
+ case 7:
+ case 12:
return this.encodeInt(this.decodeInt(value1) >>> this.decodeInt(value2));
- case UINT8_SEMANTIC:
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
break;
- case INT64_SEMANTIC:
+ case 9:
return this.encodeLong(this.decodeLong(value1) >>> this.decodeInt(value2));
}
- case UINT8_SEMANTIC:
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
break;
- case INT64_SEMANTIC:
- switch (type1.getSemantic()) {
- case INT8_SEMANTIC:
- case INT16_SEMANTIC:
- case INT32_SEMANTIC:
- case CHAR16_SEMANTIC:
- return this.encodeInt(this.decodeInt(value1) >>> (int) this.decodeLong(value2));
- case UINT8_SEMANTIC:
- case UINT16_SEMANTIC:
- case UINT32_SEMANTIC:
- case UINT64_SEMANTIC:
- case BOOL_SEMANTIC:
+ case 9:
+ switch(type1.getSemantic()) {
+ case 3:
+ case 5:
+ case 7:
+ case 12:
+ return this.encodeInt(this.decodeInt(value1) >>> (int)this.decodeLong(value2));
+ case 4:
+ case 6:
+ case 8:
+ case 10:
+ case 11:
default:
break;
- case INT64_SEMANTIC:
- return this.encodeLong(this.decodeLong(value1) >>> (int) this.decodeLong(value2));
+ case 9:
+ return this.encodeLong(this.decodeLong(value1) >>> (int)this.decodeLong(value2));
}
}
}
} catch (Exception ignored) {
-
}
+
throw new UnknownEntityException();
}
@@ -1973,15 +1941,15 @@ protected void preloadNamespaces() {
packages.DEFAULT_ITERATOR.init();
while(packages.DEFAULT_ITERATOR.hasMoreElements()) {
- this.declarePackage((Namespace)packages.DEFAULT_ITERATOR.nextKey(), file);
+ this.declarePackage(packages.DEFAULT_ITERATOR.nextKey(), file);
}
MapOf classtypes = this.getFileInfo(file).getTopLevelClasstypes();
classtypes.DEFAULT_ITERATOR.init();
while(classtypes.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType classtype = (ClassType)classtypes.DEFAULT_ITERATOR.nextKey();
- Namespace namespace = (Namespace)classtypes.DEFAULT_ITERATOR.nextValue();
+ ClassType classtype = classtypes.DEFAULT_ITERATOR.nextKey();
+ Namespace namespace = classtypes.DEFAULT_ITERATOR.nextValue();
namespace.declareMemberClasstype(this.getFileInfo(file).getIdentifierOfClasstype(classtype), classtype);
}
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorKind.java b/cl/src/main/java/com/apkide/analysis/clm/api/ErrorKind.java
similarity index 96%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorKind.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/ErrorKind.java
index 685bd76..6f24a28 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorKind.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ErrorKind.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public interface ErrorKind {
int PARSER_ERROR = 0;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorTable.java b/cl/src/main/java/com/apkide/analysis/clm/api/ErrorTable.java
similarity index 98%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorTable.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/ErrorTable.java
index 64ac0f6..dff0695 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ErrorTable.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ErrorTable.java
@@ -1,12 +1,11 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-
-
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.HashtableOfInt;
-import com.apkide.common.collections.SetOfInt;
+import com.apkide.analysis.clm.ToolsAbstraction;
+import com.apkide.analysis.clm.api.collections.HashtableOfInt;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
import java.io.IOException;
import java.util.Vector;
@@ -50,7 +49,7 @@ public void store(StoreOutputStream stream) throws IOException {
while(this.filecontents.DEFAULT_ITERATOR.hasMoreElements()) {
FileEntry file = this.filespace.getFileEntry(this.filecontents.DEFAULT_ITERATOR.nextKey());
- FileContent content = (FileContent)this.filecontents.DEFAULT_ITERATOR.nextValue();
+ FileContent content = this.filecontents.DEFAULT_ITERATOR.nextValue();
stream.writeInt(file.getID());
content.store(stream);
}
@@ -156,8 +155,6 @@ public void addParseError(FileEntry file, int startLine, int startColumn, int en
}
public void addFixClass(FileEntry file, FileEntry dir, int identifier, String msg) {
- if (this.lastError != null) {
- }
}
public void addFixGenerify(FileEntry file, String p1) {
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/FileEntry.java b/cl/src/main/java/com/apkide/analysis/clm/api/FileEntry.java
similarity index 88%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/FileEntry.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/FileEntry.java
index a881439..bd3807a 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/FileEntry.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/FileEntry.java
@@ -1,11 +1,11 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.clm.callback.OpenFileCallback;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.ListOfInt;
-import com.apkide.common.collections.MapOfIntInt;
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.callback.OpenFileCallback;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
+import com.apkide.analysis.clm.api.collections.MapOfIntInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
import java.io.CharArrayReader;
import java.io.File;
@@ -16,6 +16,7 @@
import java.util.Locale;
public class FileEntry {
+ private static final boolean DEBUG_READ = false;
private final FileSpace filespace;
private final IdentifierSpace identifiers;
private final OpenFileCallback openfilecallback;
@@ -85,8 +86,7 @@ public boolean isSolutionFile() {
public String getExtensionString() {
String filename = this.getFullNameString();
- int index=filename.lastIndexOf('.');
- return index > 0 ? filename.substring(index) : "";
+ return filename.lastIndexOf(46) > 0 ? filename.substring(filename.lastIndexOf(46)) : "";
}
public String getFullNameString() {
@@ -95,9 +95,8 @@ public String getFullNameString() {
public int getNameIdentifier() {
String filename = this.getFullNameString();
- int index=filename.lastIndexOf('.');
- if (!this.isDirectory() && index > 0) {
- filename = filename.substring(0, index);
+ if (!this.isDirectory() && filename.lastIndexOf(46) > 0) {
+ filename = filename.substring(0, filename.lastIndexOf(46));
}
return this.identifiers.get(filename);
@@ -128,8 +127,8 @@ public List getDefinedSymbols() {
}
public Reader getPreProcessedReader(SyntaxTree ast) {
- return getCodeModel() != null && getCodeModel().getPreprocessor() != null
- ? getCodeModel().getPreprocessor().process(this, this.getReaderForInclude(), ast)
+ return this.getLanguage() != null && this.getLanguage().getPreProcessor() != null
+ ? this.getLanguage().getPreProcessor().process(this, this.getReaderForInclude(), ast)
: this.getReader();
}
@@ -243,20 +242,20 @@ public Reader getReader() {
String cutomfilepath = this.parentArchivefile.getPathString();
return this.filespace
.createLineEndingNormalizedReader(
- getCodeModel().getArchiveEntryReader(cutomfilepath, this.getRelativeArchivePath(), encoding)
+ this.getLanguage().getArchiveReader().getArchiveEntryReader(cutomfilepath, this.getRelativeArchivePath(), encoding)
);
} else {
String encoding = this.filespace.getEncoding();
return this.filespace.createLineEndingNormalizedReader(this.filespace.createBomReader(new FileInputStream(this.getPathString()), encoding));
}
- } catch (IOException e) {
+ } catch (IOException var3) {
return new CharArrayReader(new char[0]);
}
}
}
public String getPathString() {
- if (this.parentdir == null && System.getProperty("os.name").toUpperCase(Locale.US).indexOf("WINDOWS") == -1) {
+ if (this.parentdir == null && !System.getProperty("os.name").toUpperCase(Locale.US).contains("WINDOWS")) {
return File.separator;
} else {
String path = "";
@@ -308,8 +307,8 @@ public FileEntry getSuccessorFile() {
return null;
}
- public CodeModel getCodeModel() {
- return filespace.getCodeModel(this);
+ public Language getLanguage() {
+ return this.filespace.getLanguage(this);
}
public int getID() {
@@ -389,11 +388,11 @@ private long fetchDiskVersion() {
if (!this.exists()) {
return 0L;
} else if (this.isArchive) {
- return getCodeModel().getArchiveVersion(this.getPathString());
+ return this.getLanguage().getArchiveReader().getArchiveVersion(this.getPathString());
} else if (this.isArchiveEntry) {
return this.parentArchivefile.getVersion();
} else {
- return this.isRootDirectory() && System.getProperty("os.name").toUpperCase(Locale.US).indexOf("WINDOWS") != -1 ? 0L : this.fetchFileDiskVersion();
+ return this.isRootDirectory() && System.getProperty("os.name").toUpperCase(Locale.US).contains("WINDOWS") ? 0L : this.fetchFileDiskVersion();
}
}
@@ -455,12 +454,12 @@ private void load() {
}
this.exists = true;
- } else if (getCodeModel() != null && getCodeModel().isSupportsFileArchives()) {
+ } else if (this.getLanguage() != null && this.getLanguage().getArchiveReader() != null) {
this.isArchive = true;
try {
- this.version = getCodeModel().getArchiveVersion(path);
- String[] fileentries = getCodeModel().getArchiveEntries(path);
+ this.version = this.getLanguage().getArchiveReader().getArchiveVersion(path);
+ String[] fileentries = this.getLanguage().getArchiveReader().getArchiveEntries(path);
if (fileentries != null) {
this.parentArchivefile = this;
this.isDirectory = true;
@@ -478,12 +477,12 @@ private void load() {
} else if (new File(path).isDirectory()) {
String[] entries = new File(path + File.separatorChar).list();
if (entries != null) {
- for(int i = 0; i < entries.length; ++i) {
- String entrypath = path + File.separatorChar + entries[i];
+ for (String entry : entries) {
+ String entrypath = path + File.separatorChar + entry;
if (new File(entrypath).isDirectory()) {
- this.addDirectory(entries[i]);
+ this.addDirectory(entry);
} else {
- this.addFile(entries[i]);
+ this.addFile(entry);
}
}
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/FileSpace.java b/cl/src/main/java/com/apkide/analysis/clm/api/FileSpace.java
new file mode 100644
index 0000000..6e26cf8
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/FileSpace.java
@@ -0,0 +1,767 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.Parser;
+import com.apkide.analysis.clm.api.callback.OpenFileCallback;
+import com.apkide.analysis.clm.api.callback.StopCallback;
+import com.apkide.analysis.clm.api.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.MapOfIntLong;
+import com.apkide.analysis.clm.api.collections.OrderedMapOfIntInt;
+import com.apkide.analysis.clm.api.collections.RelationOfIntInt;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PushbackInputStream;
+import java.io.Reader;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+public class FileSpace {
+ private static final boolean DEBUG_INCLUDE = false;
+ private final IdentifierSpace identifiers;
+ private final OpenFileCallback openfilecallback;
+ private final StopCallback stopcallback;
+ private CompletionReader completionReader = new CompletionReader();
+ private MapOfIntLong includedEntryVersions;
+ private OrderedMapOfIntInt includes;
+ private FileEntry currentIncludeFile;
+ private SetOfInt changedIncludeFiles = new SetOfInt();
+ private SetOfInt changedFiles = new SetOfInt();
+ private String encoding;
+ private FileEntry[] entries;
+ private int entryCount;
+ private FunctionOfIntInt filelanguages;
+ private FunctionOfIntInt fileassemblys;
+ private RelationOfIntInt references;
+ private OrderedMapOfIntInt assemblyreferences;
+ private SetOfFileEntry registeredcheckedfiles;
+ private SetOfFileEntry registeredsolutionfiles;
+ private SetOfFileEntry registeredresourcefiles;
+ private SetOfFileEntry checkedfiles;
+ private SetOfFileEntry solutionfiles;
+ private HashMap resourcepackagenames;
+ private HashMap assemblyProjectFilePaths;
+ private HashMap assemblyRootNamespaces;
+ private HashMap> assemblyTagLibs;
+ private HashMap> assemblyDefaultImports;
+ private HashMap> assemblyDefinedSymbols;
+ private HashMap assemblyDestinations;
+ private HashMap assemblyTargetVersions;
+ private HashMap assemblyConfigurations;
+ private Language[] languages;
+ private boolean packed;
+
+ public FileSpace(IdentifierSpace identifiers, OpenFileCallback openfilecallback, StopCallback stopcallback) {
+ this.identifiers = identifiers;
+ this.openfilecallback = openfilecallback;
+ this.stopcallback = stopcallback;
+ this.entries = new FileEntry[1000];
+ this.entries[0] = new FileEntry(identifiers, this, openfilecallback, identifiers.get(""), null);
+ this.entryCount = 1;
+ this.includedEntryVersions = new MapOfIntLong();
+ this.includes = new OrderedMapOfIntInt();
+ this.filelanguages = new FunctionOfIntInt();
+ this.fileassemblys = new FunctionOfIntInt();
+ this.references = new RelationOfIntInt();
+ this.assemblyreferences = new OrderedMapOfIntInt();
+ this.registeredcheckedfiles = new SetOfFileEntry(this);
+ this.registeredsolutionfiles = new SetOfFileEntry(this);
+ this.registeredresourcefiles = new SetOfFileEntry(this);
+ this.checkedfiles = new SetOfFileEntry(this);
+ this.solutionfiles = new SetOfFileEntry(this);
+ this.assemblyDestinations = new HashMap<>();
+ this.assemblyProjectFilePaths = new HashMap<>();
+ this.assemblyTagLibs = new HashMap<>();
+ this.assemblyDefaultImports = new HashMap<>();
+ this.assemblyDefinedSymbols = new HashMap<>();
+ this.assemblyRootNamespaces = new HashMap<>();
+ this.assemblyTargetVersions = new HashMap<>();
+ this.assemblyConfigurations = new HashMap<>();
+ this.resourcepackagenames = new HashMap<>();
+ }
+
+ public void close() {
+ for(Language l : this.languages) {
+ if (l.getArchiveReader() != null) {
+ l.getArchiveReader().close();
+ }
+ }
+ }
+
+ public void storeEntries(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.entryCount);
+ }
+
+ public void loadEntries(StoreInputStream stream) throws IOException {
+ this.entryCount = stream.readInt();
+ this.entries = new FileEntry[this.entryCount * 2];
+
+ for(int i = 0; i < this.entryCount; ++i) {
+ this.entries[i] = new FileEntry(this.identifiers, this, this.openfilecallback);
+ }
+ }
+
+ protected void load(StoreInputStream stream) throws IOException {
+ for(int i = 0; i < this.entryCount; ++i) {
+ this.entries[i].load(stream);
+ if (stream.readChar() != 'E') {
+ throw new IOException();
+ }
+ }
+
+ this.includedEntryVersions = new MapOfIntLong(stream);
+ this.includes = new OrderedMapOfIntInt(stream);
+ this.filelanguages = new FunctionOfIntInt(stream);
+ }
+
+ protected void store(StoreOutputStream stream) throws IOException {
+ for(int i = 0; i < this.entryCount; ++i) {
+ this.entries[i].store(stream);
+ stream.writeChar(69);
+ }
+
+ this.includedEntryVersions.store(stream);
+ this.includes.store(stream);
+ this.filelanguages.store(stream);
+ }
+
+ protected void update(boolean updateFileSpace) {
+ if (updateFileSpace) {
+ this.synchronize();
+ }
+
+ this.changedIncludeFiles.clear();
+ this.includedEntryVersions.DEFAULT_ITERATOR.init();
+
+ while(this.includedEntryVersions.DEFAULT_ITERATOR.hasMoreElements()) {
+ FileEntry entry = this.getFileEntry(this.includedEntryVersions.DEFAULT_ITERATOR.nextKey());
+ long version = this.includedEntryVersions.DEFAULT_ITERATOR.nextValue();
+ if (version != entry.getVersion()) {
+ this.changedIncludeFiles.put(entry.getID());
+ }
+ }
+
+ this.changedIncludeFiles.DEFAULT_ITERATOR.init();
+
+ while(this.changedIncludeFiles.DEFAULT_ITERATOR.hasMoreElements()) {
+ this.includedEntryVersions.remove(this.changedIncludeFiles.DEFAULT_ITERATOR.nextKey());
+ }
+
+ this.changedFiles.clear();
+ this.includes.DEFAULT_ITERATOR.init();
+
+ while(this.includes.DEFAULT_ITERATOR.hasMoreElements()) {
+ FileEntry entry = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextValue());
+ FileEntry file = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextKey());
+ if (this.changedIncludeFiles.contains(entry.getID())) {
+ this.changedFiles.put(file.getID());
+ }
+ }
+
+ this.changedFiles.DEFAULT_ITERATOR.init();
+
+ while(this.changedFiles.DEFAULT_ITERATOR.hasMoreElements()) {
+ this.includes.remove(this.changedFiles.DEFAULT_ITERATOR.nextKey());
+ }
+ }
+
+ private void synchronize() {
+ for(FileEntry entry : this.entries) {
+ if (entry != null) {
+ entry.synchronize();
+ }
+ }
+
+ this.packed = false;
+ }
+
+ public Language[] getLanguages() {
+ return this.languages;
+ }
+
+ protected int getLanguageID(Language language) {
+ for(int i = 0; i < this.languages.length; ++i) {
+ if (language == this.languages[i]) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ protected Language getLanguage(int id) {
+ return id < 0 ? null : this.languages[id];
+ }
+
+ protected int getAssembly(FileEntry file) {
+ this.pack();
+ return this.fileassemblys.get(file.getID());
+ }
+
+ protected String getRootNamespace(FileEntry file) {
+ int assembly = file.getAssembly();
+ return this.assemblyRootNamespaces.getOrDefault(assembly, "");
+ }
+
+ protected List getDefaultImports(FileEntry file) {
+ return this.assemblyDefaultImports.get(file.getAssembly());
+ }
+
+ protected List getDefinedSymbols(FileEntry file) {
+ return this.assemblyDefinedSymbols.get(file.getAssembly());
+ }
+
+ protected void configureEncoding(String encoding) {
+ this.encoding = encoding;
+ }
+
+ protected void configureAssembly(
+ int assembly, String projectFilePath, String rootNamespace, List defaultImports, List definedSymbols, List tagLibPaths
+ ) {
+ this.assemblyProjectFilePaths.put(assembly, projectFilePath);
+ this.assemblyRootNamespaces.put(assembly, rootNamespace);
+ this.assemblyTagLibs.put(assembly, tagLibPaths);
+ this.assemblyDefaultImports.put(assembly, defaultImports);
+ this.assemblyDefinedSymbols.put(assembly, definedSymbols);
+ }
+
+ protected void configureReference(int assembly1, int assembly2) {
+ this.references.put(assembly1, assembly2);
+ this.assemblyreferences.insert(assembly1, assembly2);
+ }
+
+ protected void configureDestination(int assembly, String destinationPath, String targetVersion, String configuration) {
+ if (destinationPath == null) {
+ destinationPath = "";
+ }
+
+ if (targetVersion == null) {
+ targetVersion = "";
+ }
+
+ this.assemblyDestinations.put(assembly, destinationPath);
+ this.assemblyTargetVersions.put(assembly, targetVersion);
+ this.assemblyConfigurations.put(assembly, configuration);
+ }
+
+ protected void configureFile(FileEntry file, int assembly, Language language, boolean checked) {
+ for(FileEntry f = file; !f.isRootDirectory() && !new File(f.getPathString()).isDirectory(); f = f.getParentDirectory()) {
+ this.filelanguages.put(f.getID(), this.getLanguageID(language));
+ }
+
+ this.filelanguages.put(file.getID(), this.getLanguageID(language));
+ this.fileassemblys.put(file.getID(), assembly);
+ if (checked) {
+ this.registeredcheckedfiles.put(file);
+ }
+
+ this.registeredsolutionfiles.put(file);
+ }
+
+ protected void configureResourceFile(FileEntry file, int assembly, String packageName) {
+ this.fileassemblys.put(file.getID(), assembly);
+ if (packageName != null) {
+ this.resourcepackagenames.put(file.getID(), packageName);
+ }
+
+ this.registeredresourcefiles.put(file);
+ }
+
+ protected void configureLanguages(Language[] languages) {
+ this.languages = languages;
+ this.fileassemblys.clear();
+ this.references.clear();
+ this.assemblyreferences.clear();
+ this.registeredcheckedfiles.clear();
+ this.registeredsolutionfiles.clear();
+ this.registeredresourcefiles.clear();
+ this.checkedfiles.clear();
+ this.solutionfiles.clear();
+ this.assemblyProjectFilePaths.clear();
+ this.assemblyRootNamespaces.clear();
+ this.assemblyTagLibs.clear();
+ this.assemblyDefaultImports.clear();
+ this.assemblyDefinedSymbols.clear();
+ this.assemblyDestinations.clear();
+ this.assemblyConfigurations.clear();
+ this.assemblyTargetVersions.clear();
+ this.resourcepackagenames.clear();
+ this.synchronize();
+ }
+
+ public List getAssemblyTagLibPaths(int assembly) {
+ return this.assemblyTagLibs.get(assembly);
+ }
+
+ public FileEntry getAssemblyHome(int assembly) {
+ return this.getEntry(this.assemblyProjectFilePaths.get(assembly)).getParentDirectory();
+ }
+
+ public String getAssemblyNameString(int assembly) {
+ return this.assemblyProjectFilePaths.get(assembly);
+ }
+
+ public String getTargetVersion(FileEntry file) {
+ return this.assemblyTargetVersions.getOrDefault(this.getAssembly(file), "");
+ }
+
+ public boolean isExternallyBuilded(FileEntry file) {
+ return !this.getConfiguration(file).equals("Extern");
+ }
+
+ public boolean isDebugBuilded(FileEntry file) {
+ return this.getConfiguration(file).equals("Debug");
+ }
+
+ private String getConfiguration(FileEntry file) {
+ return this.assemblyConfigurations.getOrDefault(this.getAssembly(file), "");
+ }
+
+ public Set getDestinationPaths(FileEntry file) {
+ return this.assemblyDestinations.containsKey(this.getAssembly(file))
+ ? Collections.singleton(this.assemblyDestinations.get(this.getAssembly(file)))
+ : Collections.EMPTY_SET;
+ }
+
+ protected boolean hasHigherPriority(FileEntry file, FileEntry referedFile1, FileEntry referedFile2) {
+ int assembly1 = this.fileassemblys.get(referedFile1.getID());
+ int assembly2 = this.fileassemblys.get(referedFile2.getID());
+ int assembly = this.fileassemblys.get(file.getID());
+ this.assemblyreferences.DEFAULT_ITERATOR.init(assembly);
+
+ while(this.assemblyreferences.DEFAULT_ITERATOR.hasMoreElements()) {
+ int referedassembly = this.assemblyreferences.DEFAULT_ITERATOR.nextValue();
+ if (referedassembly == assembly1) {
+ return true;
+ }
+
+ if (referedassembly == assembly2) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ protected boolean isReferableFrom(FileEntry file, FileEntry referingFile) {
+ this.pack();
+ return this.references.contains(this.fileassemblys.get(referingFile.getID()), this.fileassemblys.get(file.getID()));
+ }
+
+ protected boolean isReferableFrom(int assembly, int referingAssembly) {
+ this.pack();
+ return this.references.contains(referingAssembly, assembly);
+ }
+
+ private void pack() {
+ if (!this.packed) {
+ this.packed = true;
+ this.registeredcheckedfiles.DEFAULT_ITERATOR.init();
+
+ while(this.registeredcheckedfiles.DEFAULT_ITERATOR.hasMoreElements()) {
+ FileEntry file = this.registeredcheckedfiles.DEFAULT_ITERATOR.nextKey();
+ this.pack(file, this.fileassemblys.get(file.getID()), this.filelanguages.get(file.getID()), this.checkedfiles);
+ }
+
+ this.registeredsolutionfiles.DEFAULT_ITERATOR.init();
+
+ while(this.registeredsolutionfiles.DEFAULT_ITERATOR.hasMoreElements()) {
+ FileEntry file = this.registeredsolutionfiles.DEFAULT_ITERATOR.nextKey();
+ this.pack(file, this.fileassemblys.get(file.getID()), this.filelanguages.get(file.getID()), this.solutionfiles);
+ }
+ }
+ }
+
+ private void pack(FileEntry file, int assembly, int lang, SetOfFileEntry files) {
+ if (file.isDirectory()) {
+ int count = file.getChildCount();
+
+ for(int i = 0; i < count; ++i) {
+ FileEntry child = file.getChildEntry(i);
+ this.pack(child, assembly, lang, files);
+ }
+ } else {
+ this.fileassemblys.put(file.getID(), assembly);
+ this.filelanguages.put(file.getID(), lang);
+ files.put(file);
+ }
+ }
+
+ public String getResourcePackageName(FileEntry file) {
+ return this.resourcepackagenames.getOrDefault(file.getID(), "");
+ }
+
+ public Language getLanguage(FileEntry file) {
+ if (this.filelanguages.contains(file.getID())) {
+ return this.getLanguage(this.filelanguages.get(file.getID()));
+ } else {
+ this.pack();
+ return this.getLanguage(this.filelanguages.get(file.getID()));
+ }
+ }
+
+ protected boolean isCheckedSolutionFile(FileEntry file) {
+ this.pack();
+ return this.checkedfiles.contains(file);
+ }
+
+ protected boolean isSolutionFile(FileEntry file) {
+ this.pack();
+ return this.solutionfiles.contains(file);
+ }
+
+ public SetOfFileEntry getCheckedSolutionFiles() {
+ this.pack();
+ return this.checkedfiles;
+ }
+
+ public SetOfFileEntry getSolutionFiles() {
+ this.pack();
+ return this.solutionfiles;
+ }
+
+ public SetOfFileEntry getResourceFiles() {
+ this.pack();
+ return this.registeredresourcefiles;
+ }
+
+ public int getID(FileEntry file) {
+ return file == null ? -1 : file.getID();
+ }
+
+ public FileEntry getFileEntry(int id) {
+ return id == -1 ? null : this.entries[id];
+ }
+
+ public boolean checkSynchronized() throws InterruptedException {
+ for(int i = 0; i < this.entryCount; ++i) {
+ FileEntry entry = this.entries[i];
+ if (!entry.isSynchronized() && entry.getLanguage() != null) {
+ return false;
+ }
+
+ if (this.stopcallback.stopAsyncSynchronize()) {
+ throw new InterruptedException();
+ }
+ }
+
+ return true;
+ }
+
+ public FileEntry getRootDirectory() {
+ return this.entries[0];
+ }
+
+ public FileEntry getEntry(String path) {
+ while(path.endsWith(File.separator)) {
+ path = path.substring(0, path.length() - 1);
+ }
+
+ while(path.startsWith(File.separator)) {
+ path = path.substring(1);
+ }
+
+ FileEntry entry = this.getRootDirectory();
+ int oldpos = 0;
+
+ for(int pos = path.indexOf(File.separatorChar, oldpos); pos != -1; pos = path.indexOf(File.separatorChar, oldpos)) {
+ String name = path.substring(oldpos, pos);
+ if (!name.equals(".")) {
+ if (name.equals("..") && this.getRootDirectory() != entry) {
+ entry = entry.getParentDirectory();
+ } else {
+ entry = entry.getEntry(name);
+ }
+ }
+
+ oldpos = pos + 1;
+
+ while(path.charAt(oldpos) == File.separatorChar) {
+ ++oldpos;
+ }
+ }
+
+ return entry.getEntry(path.substring(oldpos));
+ }
+
+ protected String getEncoding() {
+ return this.encoding;
+ }
+
+ protected int declareEntry(FileEntry e) {
+ if (this.entryCount >= this.entries.length) {
+ FileEntry[] entities = new FileEntry[this.entries.length * 2 + 1];
+ System.arraycopy(this.entries, 0, entities, 0, this.entries.length);
+ this.entries = entities;
+ }
+
+ this.entries[this.entryCount] = e;
+ return this.entryCount++;
+ }
+
+ protected void fileIncluded(FileEntry entry) {
+ if (this.currentIncludeFile != null && this.currentIncludeFile != entry) {
+ this.includedEntryVersions.put(entry.getID(), entry.getVersion());
+ this.includes.insert(this.currentIncludeFile.getID(), entry.getID());
+ }
+ }
+
+ protected long getSyntaxVersion(FileEntry entry) {
+ if (entry.getLanguage() != null && entry.getLanguage().getPreProcessor() != null) {
+ if (!this.includes.contains(entry.getID())) {
+ this.includes.put(entry.getID(), entry.getID());
+ this.includedEntryVersions.put(entry.getID(), entry.getVersion());
+ this.currentIncludeFile = entry;
+ entry.getLanguage().getPreProcessor().processVersion(entry);
+ this.currentIncludeFile = null;
+ }
+
+ long version = 0L;
+ this.includes.DEFAULT_ITERATOR.init(entry.getID());
+
+ while(this.includes.DEFAULT_ITERATOR.hasMoreElements()) {
+ FileEntry includedFile = this.getFileEntry(this.includes.DEFAULT_ITERATOR.nextValue());
+ version = version * 37L ^ includedFile.getVersion();
+ }
+
+ return version;
+ } else {
+ return entry.getVersion();
+ }
+ }
+
+ protected void createSyntaxTree(
+ FileEntry file, SyntaxTree ast, boolean errors, boolean parseCode, boolean parseComments, String completionStr, int completionLine, int completionColumn
+ ) {
+ try {
+ ast.clear();
+ Reader reader = file.getPreProcessedReader(ast);
+ if (completionStr != null) {
+ this.completionReader.init(reader, completionStr, completionLine, completionColumn);
+ reader = this.completionReader;
+ }
+
+ ast.declareFile(file);
+ ast.declareSyntax(file.getLanguage().getSyntax());
+ ast.declareVersion(file.getSyntaxVersion());
+ ast.declareContainsComments(parseComments);
+ ast.declareContainsCode(parseCode);
+ Parser parser = file.getLanguage().getParser();
+ if (parser != null) {
+ parser.fillSyntaxTree(reader, file, file.getSyntaxVersion(), errors, ast, parseCode, parseComments);
+ } else {
+ int rootnode = ast.declareNode(0, true, new int[0], 0, 0, 1, 1);
+ ast.declareContent(this.identifiers, null, rootnode);
+ }
+
+ reader.close();
+ } catch (IOException ignored) {
+ }
+ }
+
+ protected Reader createBomReader(InputStream inStream, String fallbackEncoding) throws IOException {
+ int BOM_LENGTH = 4;
+ PushbackInputStream pbInputStream = new PushbackInputStream(inStream, 4);
+ byte[] bomBytes = new byte[4];
+
+ int totalCount;
+ int count;
+ for(totalCount = 0; totalCount < 4; totalCount += count) {
+ count = pbInputStream.read(bomBytes, totalCount, 4 - totalCount);
+ if (count == -1) {
+ break;
+ }
+ }
+
+ String encoding = null;
+ if (totalCount == 4) {
+ if ((bomBytes[0] & 255) == 0 && (bomBytes[1] & 255) == 0 && (bomBytes[2] & 255) == 254 && (bomBytes[3] & 255) == 255) {
+ encoding = "UTF-32BE";
+ } else if ((bomBytes[0] & 255) == 255 && (bomBytes[1] & 255) == 254 && (bomBytes[2] & 255) == 0 && (bomBytes[3] & 255) == 0) {
+ encoding = "UTF-32LE";
+ }
+ }
+
+ if (encoding == null && totalCount >= 3 && (bomBytes[0] & 255) == 239 && (bomBytes[1] & 255) == 187 && (bomBytes[2] & 255) == 191) {
+ encoding = "UTF-8";
+ pbInputStream.unread(bomBytes, 3, totalCount - 3);
+ }
+
+ if (encoding == null && totalCount >= 2) {
+ if ((bomBytes[0] & 255) == 254 && (bomBytes[1] & 255) == 255) {
+ encoding = "UTF-16BE";
+ } else if ((bomBytes[0] & 255) == 255 && (bomBytes[1] & 255) == 254) {
+ encoding = "UTF-16LE";
+ pbInputStream.unread(bomBytes, 2, totalCount - 2);
+ }
+ }
+
+ if (encoding == null) {
+ pbInputStream.unread(bomBytes, 0, totalCount);
+ }
+
+ if (encoding == null) {
+ return fallbackEncoding != null ? new InputStreamReader(pbInputStream, fallbackEncoding) : new InputStreamReader(pbInputStream);
+ } else {
+ return new InputStreamReader(pbInputStream, encoding);
+ }
+ }
+
+ protected Reader createLineEndingNormalizedReader(Reader reader) {
+ return new LineEndingNormalizedReader(reader);
+ }
+
+ private static class CompletionReader extends Reader {
+ private int completionLine;
+ private int completionColumn;
+ private String str;
+ private int line;
+ private int column;
+ private int pos;
+ private int maxpos;
+ private Reader reader;
+ private char[] buffer = new char[10000];
+
+ public CompletionReader(Reader reader, String str, int completionLine, int completionColumn) {
+ this.init(reader, str, completionLine, completionColumn);
+ }
+
+ public CompletionReader() {
+ }
+
+ public void init(Reader reader, String str, int completionLine, int completionColumn) {
+ this.str = str;
+ this.completionLine = completionLine;
+ this.completionColumn = completionColumn;
+ this.reader = reader;
+ this.line = this.column = 1;
+ this.pos = 0;
+ this.maxpos = 0;
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ if (this.pos >= this.maxpos) {
+ this.maxpos = this.reader.read(this.buffer);
+ if (this.maxpos == -1) {
+ return -1;
+ }
+
+ this.pos = 0;
+ }
+
+ int count = 0;
+
+ while(this.pos < this.maxpos && count < len) {
+ if (this.line == this.completionLine && this.column == this.completionColumn) {
+ if (count + this.str.length() >= len) {
+ return count;
+ }
+
+ count += this.str.length();
+
+ for(int i = 0; i < this.str.length(); ++i) {
+ cbuf[off++] = this.str.charAt(i);
+ }
+ }
+
+ char c = this.buffer[this.pos++];
+ switch(c) {
+ case '\n':
+ cbuf[off++] = c;
+ ++count;
+ ++this.line;
+ this.column = 1;
+ break;
+ case '\uFFEE':
+ if (this.pos < this.maxpos - 8 && count < len - 8) {
+ cbuf[off++] = c;
+ count += 9;
+ this.line = 0;
+ this.column = 0;
+ this.line |= (cbuf[off++] = this.buffer[this.pos++]) << 24;
+ this.line |= (cbuf[off++] = this.buffer[this.pos++]) << 16;
+ this.line |= (cbuf[off++] = this.buffer[this.pos++]) << '\b';
+ this.line |= (cbuf[off++] = this.buffer[this.pos++]);
+ this.column |= (cbuf[off++] = this.buffer[this.pos++]) << 24;
+ this.column |= (cbuf[off++] = this.buffer[this.pos++]) << 16;
+ this.column |= (cbuf[off++] = this.buffer[this.pos++]) << '\b';
+ this.column |= (cbuf[off++] = this.buffer[this.pos++]);
+ break;
+ }
+ default:
+ cbuf[off++] = c;
+ ++count;
+ ++this.column;
+ }
+ }
+
+ return count;
+ }
+
+ @Override
+ public void close() throws IOException {
+ this.reader.close();
+ }
+ }
+
+ private static class LineEndingNormalizedReader extends Reader {
+ private Reader reader;
+ private boolean rseen;
+
+ public LineEndingNormalizedReader(Reader reader) {
+ this.reader = reader;
+ this.rseen = false;
+ }
+
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ int readlen = this.reader.read(cbuf, off, len);
+ if (readlen == -1) {
+ return -1;
+ } else {
+ boolean rseen = this.rseen;
+ int destoff = off;
+ int srcoff = off;
+ int maxoff = off + readlen;
+
+ while(srcoff < maxoff) {
+ char c = cbuf[srcoff++];
+ switch(c) {
+ case '\n':
+ if (!rseen) {
+ cbuf[destoff++] = '\n';
+ }
+
+ rseen = false;
+ break;
+ case '\r':
+ cbuf[destoff++] = '\n';
+ rseen = true;
+ break;
+ default:
+ cbuf[destoff++] = c;
+ rseen = false;
+ }
+ }
+
+ this.rseen = rseen;
+ return destoff - off;
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ this.reader.close();
+ this.reader = null;
+ }
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/IdentifierSpace.java b/cl/src/main/java/com/apkide/analysis/clm/api/IdentifierSpace.java
similarity index 89%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/IdentifierSpace.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/IdentifierSpace.java
index 2236cef..d6343cc 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/IdentifierSpace.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/IdentifierSpace.java
@@ -1,11 +1,11 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
import java.io.IOException;
+import java.util.Arrays;
public class IdentifierSpace {
private static final int LOAD_FACTOR = 2;
@@ -110,8 +110,8 @@ protected void store(StoreOutputStream stream) throws IOException {
stream.writeInt(this.sizeexp);
stream.writeInt(this.count);
- for(int i = 0; i < this.hashes.length; ++i) {
- stream.writeInt(this.hashes[i]);
+ for (int hash : this.hashes) {
+ stream.writeInt(hash);
}
for(int i = 0; i < this.hashes.length; ++i) {
@@ -127,9 +127,7 @@ protected void store(StoreOutputStream stream) throws IOException {
public void clear() {
if (this.count > 0) {
- for(int i = 0; i < this.hashes.length; ++i) {
- this.hashes[i] = 0;
- }
+ Arrays.fill(this.hashes, 0);
this.count = 0;
}
@@ -193,8 +191,8 @@ public int get(char[] chars, int off, int len) {
}
}
- int step = (hash & Integer.MAX_VALUE) % (this.hashes.length - 2) + 1;
- int index = (hash & Integer.MAX_VALUE) % this.hashes.length;
+ int step = (hash & 2147483647) % (this.hashes.length - 2) + 1;
+ int index = (hash & 2147483647) % this.hashes.length;
for (int curHash = this.hashes[index]; curHash != 0; curHash = this.hashes[index]) {
if (curHash == hash) {
@@ -218,8 +216,8 @@ public int get(char[] chars, int off, int len) {
}
private void insert(int hash) {
- int index = (hash & Integer.MAX_VALUE) % this.hashes.length;
- int step = (hash & Integer.MAX_VALUE) % (this.hashes.length - 2) + 1;
+ int index = (hash & 2147483647) % this.hashes.length;
+ int step = (hash & 2147483647) % (this.hashes.length - 2) + 1;
for(int curHash = this.hashes[index]; curHash != 0; curHash = this.hashes[index]) {
index = (index + step) % this.hashes.length;
@@ -242,8 +240,8 @@ private void rehash() {
for(int i = 0; i < this.hashes.length; ++i) {
int hash = this.hashes[i];
if (hash != 0) {
- int step = (hash & Integer.MAX_VALUE) % (keys.length - 2) + 1;
- int index = (hash & Integer.MAX_VALUE) % keys.length;
+ int step = (hash & 2147483647) % (keys.length - 2) + 1;
+ int index = (hash & 2147483647) % keys.length;
while(keys[index] != 0) {
index = (index + step) % keys.length;
@@ -285,10 +283,10 @@ private void insert(char[] chars, int off, int len) {
} else if (c > 2047) {
this.utfTable[this.utfTablePos++] = (byte)(224 | c >> '\f' & 15);
this.utfTable[this.utfTablePos++] = (byte)(128 | c >> 6 & 63);
- this.utfTable[this.utfTablePos++] = (byte)(128 | c >> 0 & 63);
+ this.utfTable[this.utfTablePos++] = (byte)(128 | c & 63);
} else {
this.utfTable[this.utfTablePos++] = (byte)(192 | c >> 6 & 31);
- this.utfTable[this.utfTablePos++] = (byte)(128 | c >> 0 & 63);
+ this.utfTable[this.utfTablePos++] = (byte)(128 | c & 63);
}
}
@@ -306,7 +304,7 @@ private boolean equals(int identifier, char[] chars, int off, int len) {
return false;
}
- if (c < 1 || c > 127) {
+ if (c > 127) {
break;
}
@@ -321,7 +319,7 @@ private boolean equals(int identifier, char[] chars, int off, int len) {
return false;
}
- if (c >= 1 && c <= 127) {
+ if (c <= 127) {
if ((byte)c != this.utfTable[pos++]) {
return false;
}
@@ -334,7 +332,7 @@ private boolean equals(int identifier, char[] chars, int off, int len) {
return false;
}
- if ((byte)(128 | c >> 0 & 63) != this.utfTable[pos++]) {
+ if ((byte)(128 | c & 63) != this.utfTable[pos++]) {
return false;
}
} else {
@@ -342,7 +340,7 @@ private boolean equals(int identifier, char[] chars, int off, int len) {
return false;
}
- if ((byte)(128 | c >> 0 & 63) != this.utfTable[pos++]) {
+ if ((byte)(128 | c & 63) != this.utfTable[pos++]) {
return false;
}
}
@@ -353,7 +351,7 @@ private boolean equals(int identifier, char[] chars, int off, int len) {
public String getString(int identifier) {
if ((identifier & -2147483648) == Integer.MIN_VALUE) {
- return Character.toString((char)(identifier & Integer.MAX_VALUE));
+ return Character.toString((char)(identifier & 2147483647));
} else if ((identifier & 1073741824) == 1073741824) {
identifier &= -1073741825;
char[] chars = new char[5];
@@ -372,7 +370,7 @@ public String getString(int identifier) {
return new String(chars, 5 - len, len);
} else {
- StringBuffer buf = new StringBuffer();
+ StringBuilder buf = new StringBuilder();
int pos = identifier;
while(pos < this.utfTablePos) {
@@ -415,7 +413,7 @@ public String getString(int identifier) {
int char2 = this.utfTable[pos++] & 255;
int char3 = this.utfTable[pos++] & 255;
- buf.append((char) ((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0));
+ buf.append((char) ((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63)));
}
}
}
@@ -429,7 +427,7 @@ public int getChars(int identifier, char[] chars, int off) {
if (off + 1 >= chars.length) {
return -1;
} else {
- chars[off++] = (char)(identifier & Integer.MAX_VALUE);
+ chars[off++] = (char)(identifier & 2147483647);
return off;
}
} else if ((identifier & 1073741824) == 1073741824) {
@@ -506,7 +504,7 @@ public int getChars(int identifier, char[] chars, int off) {
int char2 = this.utfTable[pos++] & 255;
int char3 = this.utfTable[pos++] & 255;
- chars[off++] = (char) ((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0);
+ chars[off++] = (char) ((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63));
}
}
}
@@ -558,21 +556,19 @@ public boolean endsWith(int identifier, int postfixIdentifier) {
public int toUpperCase(int identifier) {
int uidentifier = this.uidentifiers.get(identifier);
- if (uidentifier != -1) {
- return uidentifier;
- } else {
+ if (uidentifier == -1) {
int off;
- while((off = this.getChars(identifier, this.uchars, 0)) == -1) {
+ while ((off = this.getChars(identifier, this.uchars, 0)) == -1) {
this.uchars = new char[this.uchars.length * 2 + 1];
}
- for(int i = 0; i < off; ++i) {
+ for (int i = 0; i < off; ++i) {
this.uchars[i] = Character.toUpperCase(this.uchars[i]);
}
uidentifier = this.get(this.uchars, 0, off);
this.uidentifiers.put(identifier, uidentifier);
- return uidentifier;
}
+ return uidentifier;
}
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Member.java b/cl/src/main/java/com/apkide/analysis/clm/api/Member.java
similarity index 91%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Member.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Member.java
index 2f4e7d1..a8cba84 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Member.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Member.java
@@ -1,22 +1,19 @@
-package com.apkide.analysis.api.clm;
-
-import static com.apkide.analysis.api.clm.TypeSemantic.NULL_SEMANTIC;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.collections.ListOf;
-import com.apkide.analysis.api.clm.collections.MapOf;
-import com.apkide.analysis.api.clm.collections.MapOfInt;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.FunctionOfIntInt;
-import com.apkide.common.collections.ListOfInt;
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.api.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.ListOf;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
+import com.apkide.analysis.clm.api.collections.MapOf;
+import com.apkide.analysis.clm.api.collections.MapOfInt;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
import java.io.IOException;
public final class Member extends Entity {
+ private static final boolean DEBUG_INFER = false;
private static final int PROPERTY_FLAG = 1;
private static final int SET_FLAG = 2;
private static final int GET_FLAG = 4;
@@ -34,23 +31,21 @@ public final class Member extends Entity {
private Data data;
private Data data() {
- if (this.data != null) {
- return this.data;
- } else {
+ if (this.data == null) {
this.data = new Data();
- return this.data;
}
+ return this.data;
}
protected Member(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace) {
- super(filespace, space);
+ super(space);
this.space = space;
this.identifiers = identifiers;
this.filespace = filespace;
}
protected Member(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace, FileEntry file, int declarationNumber) {
- super(filespace, space);
+ super(space);
this.space = space;
this.identifiers = identifiers;
this.filespace = filespace;
@@ -60,7 +55,7 @@ protected Member(EntitySpace space, IdentifierSpace identifiers, FileSpace files
}
@Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
+ protected void load(StoreInputStream stream) throws IOException {
super.load(stream);
this.id = stream.readInt();
this.file = this.filespace.getFileEntry(stream.readInt());
@@ -133,7 +128,7 @@ protected void load(@NonNull StoreInputStream stream) throws IOException {
}
@Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
+ protected void store(StoreOutputStream stream) throws IOException {
stream.writeInt(this.id);
stream.writeInt(this.file.getID());
stream.writeInt(this.declarationNumber);
@@ -477,7 +472,7 @@ public boolean isDuplicateField() {
fields.DEFAULT_ITERATOR.init(this.getIdentifier());
while(fields.DEFAULT_ITERATOR.hasMoreElements()) {
- Member field2 = (Member)fields.DEFAULT_ITERATOR.nextValue();
+ Member field2 = fields.DEFAULT_ITERATOR.nextValue();
if (field2 != this && !field2.isExplicitOverriding()) {
return true;
}
@@ -520,7 +515,7 @@ public boolean isSetProperty() {
fields.DEFAULT_ITERATOR.init();
while(fields.DEFAULT_ITERATOR.hasMoreElements()) {
- if (((Member)fields.DEFAULT_ITERATOR.nextKey()).isSetProperty()) {
+ if (fields.DEFAULT_ITERATOR.nextKey().isSetProperty()) {
return true;
}
}
@@ -538,7 +533,7 @@ public boolean isGetProperty() {
fields.DEFAULT_ITERATOR.init();
while(fields.DEFAULT_ITERATOR.hasMoreElements()) {
- if (((Member)fields.DEFAULT_ITERATOR.nextKey()).isGetProperty()) {
+ if (fields.DEFAULT_ITERATOR.nextKey().isGetProperty()) {
return true;
}
}
@@ -610,7 +605,7 @@ public Type getType(Type type, boolean readaccess) throws UnknownEntityException
if (membertype.isParameterType() && containingtype.isParameterizedType() && type.isParameterizedType()) {
Type t = ((ParameterizedType)containingtype).replaceType(membertype, true);
if (t.isParameterType()
- && ((ParameterType)t).getClasstype() == ((ParameterizedType)type).getClassType()
+ && ((ParameterType)t).getClassType() == ((ParameterizedType)type).getClassType()
&& ((ParameterizedType)type).getAbsoluteArgumentVariances()[((ParameterType)t).getAbsoluteNumber()] == 3) {
return membertype.getErasedType();
}
@@ -618,7 +613,7 @@ public Type getType(Type type, boolean readaccess) throws UnknownEntityException
} else if (membertype.isParameterType() && containingtype.isParameterizedType() && type.isParameterizedType()) {
Type t = ((ParameterizedType)containingtype).replaceType(membertype, true);
if (t.isParameterType()
- && ((ParameterType)t).getClasstype() == ((ParameterizedType)type).getClassType()
+ && ((ParameterType)t).getClassType() == ((ParameterizedType)type).getClassType()
&& ((ParameterizedType)type).getAbsoluteArgumentVariances()[((ParameterType)t).getAbsoluteNumber()] == 2
|| ((ParameterizedType)type).getAbsoluteArgumentVariances()[((ParameterType)t).getAbsoluteNumber()] == 1) {
throw new UnknownEntityException();
@@ -683,7 +678,7 @@ public int getExceptionCount() {
return this.data().exceptions == null ? 0 : this.data().exceptions.size();
}
- public MethodParameterType accessParametertype(int identifier) throws UnknownEntityException {
+ public MethodParameterType accessParameterType(int identifier) throws UnknownEntityException {
MethodParameterType type = this.data().memberParametertypes.get(identifier);
if (type == null) {
throw new UnknownEntityException();
@@ -803,11 +798,7 @@ public boolean isVisible(ClassType accessedClassType, ClassType referingClassTyp
}
if (referingClassType.isSubClassTypeOf(classtype)) {
- if (!Modifiers.isStatic(modifiers) && !accessedClassType.isSubClassTypeOf(referingClassType)) {
- return false;
- }
-
- return true;
+ return Modifiers.isStatic(modifiers) || accessedClassType.isSubClassTypeOf(referingClassType);
}
while(!referingClassType.isToplevel()) {
@@ -833,7 +824,7 @@ public Member getAnyOverriddenMember() throws UnknownEntityException {
if (this.data().overriddenmembers != null && this.data().overriddenmembers.size() != 0) {
this.data().overriddenmembers.DEFAULT_ITERATOR.init();
this.data().overriddenmembers.DEFAULT_ITERATOR.hasMoreElements();
- return (Member)this.data().overriddenmembers.DEFAULT_ITERATOR.nextKey();
+ return this.data().overriddenmembers.DEFAULT_ITERATOR.nextKey();
} else {
throw new UnknownEntityException();
}
@@ -847,7 +838,7 @@ public boolean hasOverriddenMember() {
this.data().overriddenmembers.DEFAULT_ITERATOR.init();
while(this.data().overriddenmembers.DEFAULT_ITERATOR.hasMoreElements()) {
- Member method = (Member)this.data().overriddenmembers.DEFAULT_ITERATOR.nextKey();
+ Member method = this.data().overriddenmembers.DEFAULT_ITERATOR.nextKey();
if (!method.getEnclosingClassType().isInterfaceType()) {
return true;
}
@@ -871,7 +862,7 @@ public SetOf getAllOverriddenMembers() {
methods.DEFAULT_ITERATOR.init();
while(methods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member m = (Member)methods.DEFAULT_ITERATOR.nextKey();
+ Member m = methods.DEFAULT_ITERATOR.nextKey();
alloverriddenmethods.put(m);
alloverriddenmethods.put(m.getOverriddenMembers());
}
@@ -907,7 +898,7 @@ public Type getType(Type type) throws UnknownEntityException {
if (membertype.isParameterType() && containingtype.isParameterizedType() && type.isParameterizedType()) {
Type t = ((ParameterizedType)containingtype).replaceType(membertype, true);
if (t.isParameterType()
- && ((ParameterType)t).getClasstype() == ((ParameterizedType)type).getClassType()
+ && ((ParameterType)t).getClassType() == ((ParameterizedType)type).getClassType()
&& ((ParameterizedType)type).getAbsoluteArgumentVariances()[((ParameterType)t).getAbsoluteNumber()] == 3) {
return membertype.getErasedType();
}
@@ -1021,7 +1012,7 @@ public boolean isDuplicateMethod() {
constructors.DEFAULT_ITERATOR.init();
while(constructors.DEFAULT_ITERATOR.hasMoreElements()) {
- Member constructor2 = (Member)constructors.DEFAULT_ITERATOR.nextKey();
+ Member constructor2 = constructors.DEFAULT_ITERATOR.nextKey();
if (constructor2 != this && this.areDuplicateMethods(this, constructor2)) {
return true;
}
@@ -1036,7 +1027,7 @@ public boolean isDuplicateMethod() {
methods.DEFAULT_ITERATOR.init(this.getIdentifier());
while(methods.DEFAULT_ITERATOR.hasMoreElements()) {
- Member method2 = (Member)methods.DEFAULT_ITERATOR.nextValue();
+ Member method2 = methods.DEFAULT_ITERATOR.nextValue();
if (method2 != this && !method2.isExplicitOverriding() && this.areDuplicateMethods(this, method2)) {
return true;
}
@@ -1063,7 +1054,7 @@ private boolean areDuplicateMethods(Member method1, Member method2) {
if (method1.getTypeOfParameter(i) != method2.getTypeOfParameter(i)) {
return false;
}
- } catch (UnknownEntityException var6) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1109,7 +1100,7 @@ public int getParameterCount() {
return this.data().parameterTypes == null ? 0 : this.data().parameterTypes.size();
}
- public MethodParameterType getMethodParametertype(int number) {
+ public MethodParameterType getMethodParameterType(int number) {
return this.data().methodparametertypev.get(number);
}
@@ -1182,9 +1173,7 @@ private boolean isNoVarargsCall(FileEntry file, Type argType, Type parameterType
return true;
}
- if (((ArrayType)parameterType).getElementType().isMethodParameterType()) {
- return true;
- }
+ return ((ArrayType) parameterType).getElementType().isMethodParameterType();
}
return false;
@@ -1346,7 +1335,7 @@ private Type replaceType(Type type) throws UnknownEntityException {
if (type.isMethodParameterType()) {
return this.variableReplacements.contains((MethodParameterType)type) ? this.variableReplacements.get((MethodParameterType)type) : type;
} else if (!type.isParameterizedType()) {
- return (Type)(type.isArrayType() ? this.space.getArraytype(this.replaceType(((ArrayType)type).getElementType()), 1) : type);
+ return type.isArrayType() ? this.space.getArraytype(this.replaceType(((ArrayType)type).getElementType()), 1) : type;
} else {
Type[] absoluteargumenttypes = ((ParameterizedType)type).getAbsoluteArgumentTypes();
Type[] replacedtypes = new Type[absoluteargumenttypes.length];
@@ -1381,7 +1370,7 @@ private boolean getReplacements(
this.variableReplacements.clear();
for(int i = 0; i < typeargcount; ++i) {
- this.variableReplacements.put(method.getMethodParametertype(i), typearguments[typeargoff + i]);
+ this.variableReplacements.put(method.getMethodParameterType(i), typearguments[typeargoff + i]);
}
return this.isWithinBounds(method, type);
@@ -1396,15 +1385,15 @@ private boolean getReplacements(
this.variables.DEFAULT_ITERATOR.init();
while(this.variables.DEFAULT_ITERATOR.hasMoreElements()) {
- MethodParameterType variable = (MethodParameterType)this.variables.DEFAULT_ITERATOR.nextKey();
+ MethodParameterType variable = this.variables.DEFAULT_ITERATOR.nextKey();
for(int i = 0; i < parametercount; ++i) {
Type parametertype = method.getTypeOfParameter(type, i);
if (parametertype.isParameterizedType()) {
Type[] argtypes = ((ParameterizedType)parametertype).getAbsoluteArgumentTypes();
- for(int j = 0; j < argtypes.length; ++j) {
- if (variable == argtypes[j]) {
+ for (Type argtype : argtypes) {
+ if (variable == argtype) {
if (!this.captureVariables.contains(variable.getID())) {
this.captureVariables.put(variable.getID(), 0);
}
@@ -1434,7 +1423,7 @@ private boolean getReplacements(
}
private boolean constrainSub(Type fromtype, Type totype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (fromtype == totype) {
return true;
@@ -1469,7 +1458,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
fromsupertypes.DEFAULT_ITERATOR.init();
while(fromsupertypes.DEFAULT_ITERATOR.hasMoreElements()) {
- Type subsupertype = (Type)fromsupertypes.DEFAULT_ITERATOR.nextKey();
+ Type subsupertype = fromsupertypes.DEFAULT_ITERATOR.nextKey();
if (subsupertype == totype) {
return true;
}
@@ -1490,7 +1479,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
if (this.isConversion(this.file, boundtype.getErasedType(), totype.getErasedType(), this.noboxing)) {
return this.constrainSub(boundtype, totype);
}
- } catch (UnknownEntityException var11) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1504,7 +1493,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
if (this.isConversion(this.file, boundtype.getErasedType(), totype.getErasedType(), this.noboxing)) {
return this.constrainSub(boundtype, totype);
}
- } catch (UnknownEntityException var12) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1600,7 +1589,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
fromsupertypes.DEFAULT_ITERATOR.init();
while(fromsupertypes.DEFAULT_ITERATOR.hasMoreElements()) {
- Type subsupertype = (Type)fromsupertypes.DEFAULT_ITERATOR.nextKey();
+ Type subsupertype = fromsupertypes.DEFAULT_ITERATOR.nextKey();
if (subsupertype == totype) {
return true;
}
@@ -1609,7 +1598,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
if (((ParameterizedType)subsupertype).getClassType() == toclasstype) {
try {
return this.constrainSub(((ParameterizedType)fromtype).replaceType(subsupertype), totype);
- } catch (UnknownEntityException var14) {
+ } catch (UnknownEntityException ignored) {
}
}
} else if (subsupertype == toclasstype) {
@@ -1623,7 +1612,7 @@ private boolean constrainSub(Type fromtype, Type totype) {
}
private boolean constrainSuper(Type fromtype, Type totype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (fromtype == totype) {
return true;
@@ -1713,7 +1702,7 @@ private boolean constrainSuper(Type fromtype, Type totype) {
tosupertypes.DEFAULT_ITERATOR.init();
while(tosupertypes.DEFAULT_ITERATOR.hasMoreElements()) {
- Type tosupertype = (Type)tosupertypes.DEFAULT_ITERATOR.nextKey();
+ Type tosupertype = tosupertypes.DEFAULT_ITERATOR.nextKey();
if (tosupertype == fromtype) {
return true;
}
@@ -1722,7 +1711,7 @@ private boolean constrainSuper(Type fromtype, Type totype) {
if (((ParameterizedType)tosupertype).getClassType() == fromclasstype) {
try {
return this.constrainSuper(fromtype, ((ParameterizedType)totype).replaceType(tosupertype));
- } catch (UnknownEntityException var12) {
+ } catch (UnknownEntityException ignored) {
}
}
} else if (tosupertype == fromclasstype) {
@@ -1741,7 +1730,7 @@ private boolean constrainSuper(Type fromtype, Type totype) {
tosupertypes.DEFAULT_ITERATOR.init();
while(tosupertypes.DEFAULT_ITERATOR.hasMoreElements()) {
- Type tosupertype = (Type)tosupertypes.DEFAULT_ITERATOR.nextKey();
+ Type tosupertype = tosupertypes.DEFAULT_ITERATOR.nextKey();
if (tosupertype == fromtype) {
return true;
}
@@ -1750,11 +1739,9 @@ private boolean constrainSuper(Type fromtype, Type totype) {
if (((ParameterizedType)tosupertype).getClassType() == fromtype) {
try {
return this.constrainSuper(fromtype, ((ParameterizedType)totype).replaceType(tosupertype));
- } catch (UnknownEntityException var13) {
+ } catch (UnknownEntityException ignored) {
}
}
- } else if (tosupertype == fromtype) {
- return true;
}
}
@@ -1763,7 +1750,7 @@ private boolean constrainSuper(Type fromtype, Type totype) {
}
private boolean constrainEqual(Type fromtype, Type totype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (fromtype == totype) {
return true;
@@ -1771,10 +1758,10 @@ private boolean constrainEqual(Type fromtype, Type totype) {
if (this.variables.contains(totype)) {
return this.mustBeEqual((MethodParameterType)totype, fromtype);
} else {
- return fromtype == totype;
+ return false;
}
} else if (totype.isArrayType()) {
- return fromtype.isArrayType() ? this.constrainEqual(((ArrayType)fromtype).getElementType(), ((ArrayType)totype).getElementType()) : false;
+ return fromtype.isArrayType() && this.constrainEqual(((ArrayType) fromtype).getElementType(), ((ArrayType) totype).getElementType());
} else if (totype.isParameterizedType()) {
if (fromtype.isParameterizedType() && ((ParameterizedType)totype).getClassType() == ((ParameterizedType)fromtype).getClassType()) {
Type[] argumenttypesto = ((ParameterizedType)totype).getAbsoluteArgumentTypes();
@@ -1797,12 +1784,12 @@ private boolean constrainEqual(Type fromtype, Type totype) {
return false;
}
} else {
- return fromtype == totype;
+ return false;
}
}
private boolean mustBeEqual(MethodParameterType methodparametertype, Type fromtype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (this.constraintsEqual.contains(methodparametertype)) {
return this.constraintsEqual.get(methodparametertype) == fromtype;
@@ -1810,7 +1797,7 @@ private boolean mustBeEqual(MethodParameterType methodparametertype, Type fromty
this.constraintsSuper.DEFAULT_ITERATOR.init(methodparametertype);
while(this.constraintsSuper.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
if (!this.isConversion(this.file, type, fromtype, this.noboxing)) {
return false;
}
@@ -1820,7 +1807,7 @@ private boolean mustBeEqual(MethodParameterType methodparametertype, Type fromty
this.constraintsSub.DEFAULT_ITERATOR.init(methodparametertype);
while(this.constraintsSub.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSub.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSub.DEFAULT_ITERATOR.nextValue();
if (!this.isConversion(this.file, fromtype, type, this.noboxing)) {
return false;
}
@@ -1842,7 +1829,7 @@ private boolean mustHaveVariance(Type fromtype, int variance) {
}
private boolean mustBeSubtype(MethodParameterType methodparametertype, Type fromtype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (this.constraintsEqual.contains(methodparametertype)) {
return this.isConversion(this.file, this.constraintsEqual.get(methodparametertype), fromtype, this.noboxing);
@@ -1850,7 +1837,7 @@ private boolean mustBeSubtype(MethodParameterType methodparametertype, Type from
this.constraintsSuper.DEFAULT_ITERATOR.init(methodparametertype);
while(this.constraintsSuper.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
if (!this.isConversion(this.file, type, fromtype, this.noboxing)) {
return false;
}
@@ -1862,7 +1849,7 @@ private boolean mustBeSubtype(MethodParameterType methodparametertype, Type from
}
private boolean mustBeSupertype(MethodParameterType methodparametertype, Type fromtype) {
- if (fromtype.getSemantic() == NULL_SEMANTIC) {
+ if (fromtype.getSemantic() == 2) {
return true;
} else if (this.constraintsEqual.contains(methodparametertype)) {
return this.isConversion(this.file, fromtype, this.constraintsEqual.get(methodparametertype), this.noboxing);
@@ -1870,7 +1857,7 @@ private boolean mustBeSupertype(MethodParameterType methodparametertype, Type fr
this.constraintsSub.DEFAULT_ITERATOR.init(methodparametertype);
while(this.constraintsSub.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSub.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSub.DEFAULT_ITERATOR.nextValue();
if (!this.isConversion(this.file, fromtype, type, this.noboxing)) {
return false;
}
@@ -1886,8 +1873,8 @@ private boolean processConstraints() {
this.variables.DEFAULT_ITERATOR.init();
while(this.variables.DEFAULT_ITERATOR.hasMoreElements()) {
- MethodParameterType methodparametertype = (MethodParameterType)this.variables.DEFAULT_ITERATOR.nextKey();
- MethodParametertypeVariable variabletype = this.space.getMethodParametertypeVariableFor(methodparametertype);
+ MethodParameterType methodparametertype = this.variables.DEFAULT_ITERATOR.nextKey();
+ MethodParameterTypeVariable variabletype = this.space.getMethodParametertypeVariableFor(methodparametertype);
Type replacementtype = variabletype;
if (this.constraintsEqual.contains(methodparametertype)) {
replacementtype = this.constraintsEqual.get(methodparametertype);
@@ -1897,10 +1884,10 @@ private boolean processConstraints() {
} else if (this.constraintsSub.count(methodparametertype) > 1) {
this.constraintsSub.DEFAULT_ITERATOR.init(methodparametertype);
this.constraintsSub.DEFAULT_ITERATOR.hasMoreElements();
- replacementtype = (Type)this.constraintsSub.DEFAULT_ITERATOR.nextValue();
+ replacementtype = this.constraintsSub.DEFAULT_ITERATOR.nextValue();
while(this.constraintsSub.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSub.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSub.DEFAULT_ITERATOR.nextValue();
if (this.isConversion(this.file, type, replacementtype, this.noboxing)) {
replacementtype = type;
} else if (!this.isConversion(this.file, replacementtype, type, this.noboxing)) {
@@ -1917,7 +1904,7 @@ private boolean processConstraints() {
this.constraintsSuper.DEFAULT_ITERATOR.init(methodparametertype);
while(this.constraintsSuper.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
+ Type type = this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
if (type.isArrayType()) {
int tdim = ((ArrayType)type).getDimension();
if (dim != -1 && dim != tdim) {
@@ -1931,34 +1918,30 @@ private boolean processConstraints() {
}
if (replacementtype == variabletype) {
- if (primitivearray) {
- replacementtype = this.space.getArraytype(this.space.getRootClasstype(this.file), dim);
- } else {
- this.constraintsSuper.DEFAULT_ITERATOR.init(methodparametertype);
-
- while(this.constraintsSuper.DEFAULT_ITERATOR.hasMoreElements()) {
- Type type = (Type)this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
- if (type.isArrayType()) {
- type = ((ArrayType)type).getElementType();
- }
+ this.constraintsSuper.DEFAULT_ITERATOR.init(methodparametertype);
- if (replacementtype == null) {
- replacementtype = type;
- } else if (this.isConversion(this.file, replacementtype, type, this.noboxing)) {
- replacementtype = type;
- } else if (!this.isConversion(this.file, type, replacementtype, this.noboxing)) {
- replacementtype = type.getCommonSuperTypeWith(this.file, replacementtype);
- }
+ while(this.constraintsSuper.DEFAULT_ITERATOR.hasMoreElements()) {
+ Type type = this.constraintsSuper.DEFAULT_ITERATOR.nextValue();
+ if (type.isArrayType()) {
+ type = ((ArrayType)type).getElementType();
}
- if (dim != -1) {
- for(int i = 0; i < dim; ++i) {
- replacementtype = this.space.getArraytype(replacementtype, 1);
- }
+ if (replacementtype == null) {
+ replacementtype = type;
+ } else if (this.isConversion(this.file, replacementtype, type, this.noboxing)) {
+ replacementtype = type;
+ } else if (!this.isConversion(this.file, type, replacementtype, this.noboxing)) {
+ replacementtype = type.getCommonSuperTypeWith(this.file, replacementtype);
+ }
+ }
+
+ if (dim != -1) {
+ for(int i = 0; i < dim; ++i) {
+ replacementtype = this.space.getArraytype(replacementtype, 1);
}
}
}
- } catch (UnknownEntityException var8) {
+ } catch (UnknownEntityException ignored) {
}
}
@@ -1976,8 +1959,8 @@ private boolean isWithinBounds(Member method, Type containertype) {
this.variableReplacements.DEFAULT_ITERATOR.init();
while(this.variableReplacements.DEFAULT_ITERATOR.hasMoreElements()) {
- MethodParameterType methodparametertype = (MethodParameterType)this.variableReplacements.DEFAULT_ITERATOR.nextKey();
- Type replacementtype = (Type)this.variableReplacements.DEFAULT_ITERATOR.nextValue();
+ MethodParameterType methodparametertype = this.variableReplacements.DEFAULT_ITERATOR.nextKey();
+ Type replacementtype = this.variableReplacements.DEFAULT_ITERATOR.nextValue();
if (!this.isWithinBounds(method, containertype, methodparametertype, replacementtype)) {
return false;
}
@@ -1997,7 +1980,7 @@ private boolean isWithinBounds(Member method, Type type, MethodParameterType met
return false;
}
}
- } catch (UnknownEntityException var9) {
+ } catch (UnknownEntityException ignored) {
}
return true;
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterType.java b/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterType.java
new file mode 100644
index 0000000..6674804
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterType.java
@@ -0,0 +1,225 @@
+package com.apkide.analysis.clm.api;
+
+import static com.apkide.analysis.clm.api.TypeSemantic.UNKNOWN_SEMANTIC;
+
+import com.apkide.analysis.clm.api.collections.ListOf;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+import java.io.IOException;
+
+public final class MethodParameterType extends Type {
+ private int myID;
+ private final EntitySpace mySpace;
+ private final IdentifierSpace myIdentifiers;
+ private final FileSpace myFileSpace;
+ private FileEntry myFile;
+ private int myDeclarationNumber;
+ private int myLine;
+ private int myStartColumn;
+ private int myEndColumn;
+ private int myIdentifier;
+ private Member myMethod;
+ private int myNumber;
+ private ListOf myBoundTypes;
+ private boolean myTypesLoaded;
+
+ protected MethodParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace fileSpace) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myIdentifiers = identifiers;
+ this.myFileSpace = fileSpace;
+ }
+
+ protected MethodParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace, FileEntry file, int declarationNumber) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myIdentifiers = identifiers;
+ this.myFileSpace = filespace;
+ this.myID = space.declareEntity(this);
+ this.myFile = file;
+ this.myDeclarationNumber = declarationNumber;
+ this.myBoundTypes = null;
+ this.myTypesLoaded = false;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myLine = stream.readInt();
+ this.myStartColumn = stream.readInt();
+ this.myEndColumn = stream.readInt();
+ this.myID = stream.readInt();
+ this.myFile = this.myFileSpace.getFileEntry(stream.readInt());
+ this.myDeclarationNumber = stream.readInt();
+ this.myIdentifier = stream.readInt();
+ this.myMethod = (Member)this.mySpace.getEntity(stream.readInt());
+ this.myNumber = stream.readInt();
+ this.myTypesLoaded = stream.readBoolean();
+ if (stream.readBoolean()) {
+ this.myBoundTypes = new ListOf<>(this.mySpace, stream);
+ }
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myLine);
+ stream.writeInt(this.myStartColumn);
+ stream.writeInt(this.myEndColumn);
+ stream.writeInt(this.myID);
+ stream.writeInt(this.myFile.getID());
+ stream.writeInt(this.myDeclarationNumber);
+ stream.writeInt(this.myIdentifier);
+ stream.writeInt(this.mySpace.getID(this.myMethod));
+ stream.writeInt(this.myNumber);
+ stream.writeBoolean(this.myTypesLoaded);
+ stream.writeBoolean(this.myBoundTypes != null);
+ if (this.myBoundTypes != null) {
+ this.myBoundTypes.store(stream);
+ }
+ }
+
+ protected void invalidate() {
+ if (this.myBoundTypes != null) {
+ this.myBoundTypes.clear();
+ }
+
+ this.myTypesLoaded = false;
+ }
+
+ protected void declareBoundType(Type boundType) {
+ this.myBoundTypes.add(boundType);
+ this.myTypesLoaded = true;
+ }
+
+ protected void declarePositions(int line, int startColumn, int endColumn) {
+ this.myLine = line;
+ this.myStartColumn = startColumn;
+ this.myEndColumn = endColumn;
+ }
+
+ protected void declareSyntax(int identifier, Member method, int number) {
+ this.myIdentifier = identifier;
+ this.myMethod = method;
+ this.myNumber = number;
+ if (this.myBoundTypes == null) {
+ this.myBoundTypes = new ListOf<>(this.mySpace);
+ } else {
+ this.myBoundTypes.clear();
+ }
+ }
+
+ @Override
+ public int getIdentifierLine() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myLine;
+ }
+
+ @Override
+ public int getIdentifierEndColumn() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myEndColumn;
+ }
+
+ @Override
+ public int getIdentifierStartColumn() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myStartColumn;
+ }
+
+ public Member getMethod() {
+ return this.myMethod;
+ }
+
+ public int getNumber() {
+ return this.myNumber;
+ }
+
+ @Override
+ public FileEntry getFile() {
+ return this.myFile;
+ }
+
+ @Override
+ public int getDeclarationNumber() {
+ return this.myDeclarationNumber;
+ }
+
+ public int getBoundTypeCount() {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() != 0 ? this.myBoundTypes.size() : 1;
+ }
+
+ public Type getBoundType(Type type, int number) throws UnknownEntityException {
+ Type membertype = this.getBoundType(number);
+ if (type.isClassType()) {
+ Type containingtype = ((ClassType)type).getContainingTypeOfMember(this.myMethod);
+ return containingtype.isParameterizedType() ? ((ParameterizedType)containingtype).replaceType(membertype) : membertype;
+ } else {
+ Type containingtype = ((ParameterizedType)type).getClassType().getContainingTypeOfMember(this.myMethod);
+ return !containingtype.isParameterizedType()
+ ? ((ParameterizedType)type).replaceType(membertype)
+ : ((ParameterizedType)type).replaceType(((ParameterizedType)containingtype).replaceType(membertype));
+ }
+ }
+
+ public Type getBoundType(int number) throws UnknownEntityException {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() > 0 ? this.myBoundTypes.get(number) : this.mySpace.getRootClasstype(this.myFile);
+ }
+
+ @Override
+ public Type getErasedType() throws UnknownEntityException {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() > 0 ? this.myBoundTypes.get(0) : this.mySpace.getRootClasstype(this.myFile);
+ }
+
+ @Override
+ public ClassType getEnclosingClassType() {
+ return this.myMethod.getEnclosingClassType();
+ }
+
+ @Override
+ public ClassType getEnclosingTopLevelClassType() {
+ return this.myMethod.getEnclosingClassType().getEnclosingTopLevelClassType();
+ }
+
+ @Override
+ public int getIdentifier() {
+ return this.myIdentifier;
+ }
+
+ @Override
+ public int getID() {
+ return this.myID;
+ }
+
+ private void loadBounds() {
+ if (!this.myTypesLoaded) {
+ this.myTypesLoaded = true;
+ if (this.myFile.getLanguage().getTypeSystem().inheritsBoundTypes() && this.myMethod.getOverriddenMembers().size() > 0) {
+ try {
+ Member oMethod = this.myMethod.getOverriddenMembers().get();
+ int count = oMethod.getMethodParametertypeCount();
+
+ for(int number = 0; number < count; ++number) {
+ MethodParameterType methodParameterType = oMethod.getMethodParameterType(number);
+ int identifier = methodParameterType.getIdentifier();
+ MethodParameterType methodparametertype = this.myMethod.accessParameterType(identifier);
+ int boundCount = methodParameterType.getBoundTypeCount();
+
+ for(int j = 0; j < boundCount; ++j) {
+ Type boundtype = methodParameterType.getBoundType(this.myMethod.getEnclosingClassType().parameterizeCanonical(), j);
+ this.mySpace.declareBoundtype(methodparametertype, boundtype);
+ }
+ }
+ } catch (UnknownEntityException ignored) {
+ }
+ } else {
+ this.mySpace.loadTypes(this.myFile);
+ }
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterTypeVariable.java b/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterTypeVariable.java
new file mode 100644
index 0000000..345c833
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/MethodParameterTypeVariable.java
@@ -0,0 +1,55 @@
+package com.apkide.analysis.clm.api;
+
+import static com.apkide.analysis.clm.api.TypeSemantic.UNKNOWN_SEMANTIC;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+
+public final class MethodParameterTypeVariable extends Type {
+ private final EntitySpace mySpace;
+ private int myEntity;
+ private MethodParameterType myMethodParameterType;
+
+ public MethodParameterTypeVariable(EntitySpace space) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ }
+
+ public MethodParameterTypeVariable(EntitySpace space, MethodParameterType methodParameterType) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myEntity = space.declareEntity(this);
+ this.myMethodParameterType = methodParameterType;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myEntity = stream.readInt();
+ this.myMethodParameterType = (MethodParameterType)this.mySpace.getEntity(stream.readInt());
+ }
+
+ @Override
+ public int getID() {
+ return this.myEntity;
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myEntity);
+ stream.writeInt(this.mySpace.getID(this.myMethodParameterType));
+ }
+
+ @Override
+ public Language getLanguage() {
+ return this.getMethodParameterType().getLanguage();
+ }
+
+ public MethodParameterType getMethodParameterType() {
+ return this.myMethodParameterType;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/Model.java b/cl/src/main/java/com/apkide/analysis/clm/api/Model.java
new file mode 100644
index 0000000..cec736f
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Model.java
@@ -0,0 +1,181 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.callback.APISearcherCallback;
+import com.apkide.analysis.clm.api.callback.CodeCompleterCallback;
+import com.apkide.analysis.clm.api.callback.HighlighterCallback;
+import com.apkide.analysis.clm.api.callback.OpenFileCallback;
+import com.apkide.analysis.clm.api.callback.RefactoringCallback;
+import com.apkide.analysis.clm.api.callback.StopCallback;
+import com.apkide.analysis.clm.api.callback.StructureCallback;
+import com.apkide.analysis.clm.api.callback.SymbolSearcherCallback;
+
+import com.apkide.analysis.clm.api.callback.UsageSearcherCallback;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+import java.util.List;
+
+public class Model {
+ private static int modelCount = 0;
+ public final StructureCallback structurecallback;
+ public final HighlighterCallback highlightercallback;
+ public final SymbolSearcherCallback symbolcallback;
+ public final CodeCompleterCallback completercallback;
+ public final RefactoringCallback refactorcallback;
+ public final UsageSearcherCallback usagesearchercallback;
+ public final APISearcherCallback apisearchercallback;
+ public final StopCallback stopcallback;
+ public final OpenFileCallback openfilecallback;
+ public final IdentifierSpace identifiers;
+ public final FileSpace filespace;
+ public final SyntaxTreeSpace trees;
+ public final EntitySpace space;
+ public final Compiler compiler;
+ public ErrorTable errortable;
+ private CodingStyle codingstyle;
+ private String[] todos;
+ private boolean[] todoCaseSensitive;
+
+ public Model() {
+ this(null, null, null, null, null, null, null, null, null);
+ }
+
+ public Model(
+ StructureCallback structurecallback,
+ HighlighterCallback highlightercallback,
+ SymbolSearcherCallback symbolcallback,
+ CodeCompleterCallback completercallback,
+ RefactoringCallback refactorcallback,
+ UsageSearcherCallback usagesearchercallback,
+ APISearcherCallback apisearchercallback,
+ StopCallback stopcallback,
+ OpenFileCallback openfilecallback
+ ) {
+ this.structurecallback = structurecallback;
+ this.highlightercallback = highlightercallback;
+ this.symbolcallback = symbolcallback;
+ this.completercallback = completercallback;
+ this.refactorcallback = refactorcallback;
+ this.usagesearchercallback = usagesearchercallback;
+ this.apisearchercallback = apisearchercallback;
+ this.stopcallback = stopcallback;
+ this.openfilecallback = openfilecallback;
+ ++modelCount;
+ this.identifiers = new IdentifierSpace();
+ this.filespace = new FileSpace(this.identifiers, openfilecallback, stopcallback);
+ this.trees = new SyntaxTreeSpace(this.identifiers, this.filespace);
+ this.space = new EntitySpace(this.identifiers, this.filespace, this.trees, stopcallback);
+ this.errortable = new ErrorTable(this);
+ this.compiler = new Compiler(this);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ --modelCount;
+ }
+
+ public void close() {
+ }
+
+ protected void load(StoreInputStream stream) throws IOException {
+ this.filespace.loadEntries(stream);
+ this.space.loadEntries(stream);
+ this.identifiers.load(stream);
+ this.filespace.load(stream);
+ this.space.load(stream);
+ this.errortable.load(stream);
+ this.compiler.load(stream);
+ }
+
+ protected void store(StoreOutputStream stream) throws IOException {
+ this.filespace.storeEntries(stream);
+ this.space.storeEntries(stream);
+ this.identifiers.store(stream);
+ this.filespace.store(stream);
+ this.space.store(stream);
+ this.errortable.store(stream);
+ this.compiler.store(stream);
+ }
+
+ public void begin(boolean updateFileSpace) {
+ this.filespace.update(updateFileSpace);
+ this.trees.update();
+ this.space.update();
+ this.space.preloadNamespaces();
+ this.compiler.update();
+ }
+
+ public void shrink(boolean full) {
+ this.trees.shrink(full);
+ this.space.shrink(full);
+ if (full) {
+ Language[] languages = this.filespace.getLanguages();
+
+ for(Language language : languages) {
+ language.shrink();
+ }
+
+ SyntaxTreePool.shrink();
+ }
+ }
+
+ public void done() {
+ this.trees.releaseSyntaxTrees();
+ this.filespace.close();
+ }
+
+ public void reconfigure() {
+ this.space.invalidateAll();
+ }
+
+ public void configureLanguages(Language[] languages) {
+ this.filespace.configureLanguages(languages);
+ this.space.invalidateNamespaces();
+ }
+
+ public void configureDestination(int assembly, String destinationPath, String targetVersion, String configuration) {
+ this.filespace.configureDestination(assembly, destinationPath, targetVersion, configuration);
+ }
+
+ public void configureEncoding(String encoding) {
+ this.filespace.configureEncoding(encoding);
+ }
+
+ public void configureAssembly(
+ int assembly, String projectFilePath, String rootNamespace, List defaultImports, List definedSymbols, List tagLibPaths
+ ) {
+ this.filespace.configureAssembly(assembly, projectFilePath, rootNamespace, defaultImports, definedSymbols, tagLibPaths);
+ }
+
+ public void configureReference(int assembly1, int assembly2) {
+ this.filespace.configureReference(assembly1, assembly2);
+ }
+
+ public void configureFile(FileEntry file, int assembly, Language language, boolean checked) {
+ this.filespace.configureFile(file, assembly, language, checked);
+ }
+
+ public void configureResourceFile(FileEntry file, int assembly, String packageName) {
+ this.filespace.configureResourceFile(file, assembly, packageName);
+ }
+
+ public String[] getTodos() {
+ return this.todos;
+ }
+
+ public boolean[] getTodoCasesensitive() {
+ return this.todoCaseSensitive;
+ }
+
+ public CodingStyle getCodingstyle() {
+ return this.codingstyle;
+ }
+
+ public void registerOptions(CodingStyle codingstyle, String[] todos, boolean[] todoCaseSensitive) {
+ this.codingstyle = codingstyle;
+ this.todos = todos;
+ this.todoCaseSensitive = todoCaseSensitive;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Modifiers.java b/cl/src/main/java/com/apkide/analysis/clm/api/Modifiers.java
similarity index 69%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Modifiers.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Modifiers.java
index 537f44a..24f78a8 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Modifiers.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Modifiers.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public class Modifiers {
public static final int PUBLIC_MODIFIER = 1;
@@ -39,83 +39,83 @@ public static boolean isPackagePrivate(int modifiers) {
return (modifiers & 32) != 0;
}
- public static final boolean isInternal(int modifiers) {
+ public static boolean isInternal(int modifiers) {
return (modifiers & 16) != 0;
}
- public static final boolean isNew(int modifiers) {
+ public static boolean isNew(int modifiers) {
return (modifiers & 262144) != 0;
}
- public static final boolean isExtern(int modifiers) {
+ public static boolean isExtern(int modifiers) {
return (modifiers & 524288) != 0;
}
- public static final boolean isOverride(int modifiers) {
+ public static boolean isOverride(int modifiers) {
return (modifiers & 65536) != 0;
}
- public static final boolean isSealed(int modifiers) {
+ public static boolean isSealed(int modifiers) {
return (modifiers & 128) != 0;
}
- public static final boolean isVirtual(int modifiers) {
+ public static boolean isVirtual(int modifiers) {
return (modifiers & 32768) != 0;
}
- public static final boolean isReadonly(int modifiers) {
+ public static boolean isReadonly(int modifiers) {
return (modifiers & 256) != 0;
}
- public static final boolean isConst(int modifiers) {
+ public static boolean isConst(int modifiers) {
return (modifiers & 512) != 0;
}
- public static final boolean isParams(int modifiers) {
+ public static boolean isParams(int modifiers) {
return (modifiers & 4194304) != 0;
}
- public static final boolean isRef(int modifiers) {
+ public static boolean isRef(int modifiers) {
return (modifiers & 16777216) != 0;
}
- public static final boolean isOut(int modifiers) {
+ public static boolean isOut(int modifiers) {
return (modifiers & 8388608) != 0;
}
- public static final boolean isEvent(int modifiers) {
+ public static boolean isEvent(int modifiers) {
return (modifiers & 1048576) != 0;
}
- public static final boolean isPublic(int modifiers) {
+ public static boolean isPublic(int modifiers) {
return (modifiers & 1) != 0;
}
- public static final boolean isProtected(int modifiers) {
+ public static boolean isProtected(int modifiers) {
return (modifiers & 8) != 0;
}
- public static final boolean isCSPrivate(int modifiers) {
+ public static boolean isCSPrivate(int modifiers) {
return (modifiers & 2) != 0;
}
- public static final boolean isJavaPrivate(int modifiers) {
+ public static boolean isJavaPrivate(int modifiers) {
return (modifiers & 4) != 0;
}
- public static final boolean isEnum(int modifiers) {
+ public static boolean isEnum(int modifiers) {
return (modifiers & 268435456) != 0;
}
- public static final boolean isAbstract(int modifiers) {
+ public static boolean isAbstract(int modifiers) {
return (modifiers & 16384) != 0;
}
- public static final boolean isStatic(int modifiers) {
+ public static boolean isStatic(int modifiers) {
return (modifiers & 64) != 0;
}
- public static final boolean isStrict(int modifiers) {
+ public static boolean isStrict(int modifiers) {
return (modifiers & 8192) != 0;
}
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/Namespace.java b/cl/src/main/java/com/apkide/analysis/clm/api/Namespace.java
new file mode 100644
index 0000000..c0f708f
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Namespace.java
@@ -0,0 +1,405 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.MapOfInt;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+import java.io.IOException;
+
+public final class Namespace extends Entity {
+ private int entity;
+ private final EntitySpace space;
+ private final IdentifierSpace identifiers;
+ private final FileSpace filespace;
+ private int identifier;
+ private Namespace enclosingNamespace;
+ private boolean exists;
+ private MapOfInt memberNamespaces;
+ private MapOfInt memberClasstypes;
+ private SetOfFileEntry memberFiles;
+ private SetOfInt assemblies;
+ private MapOfInt memberClasstypesCaseInsensitive;
+
+ protected Namespace(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace) {
+ super(space);
+ this.space = space;
+ this.identifiers = identifiers;
+ this.filespace = filespace;
+ }
+
+ protected Namespace(EntitySpace space, IdentifierSpace identifiers, FileSpace filespace, int identifier, Namespace enclosingPackage) {
+ super(space);
+ this.space = space;
+ this.identifiers = identifiers;
+ this.filespace = filespace;
+ this.identifier = identifier;
+ this.entity = space.declareEntity(this);
+ this.enclosingNamespace = enclosingPackage;
+ this.exists = enclosingPackage == null;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.identifier = stream.readInt();
+ this.entity = stream.readInt();
+ this.enclosingNamespace = (Namespace)this.space.getEntity(stream.readInt());
+ this.exists = stream.readBoolean();
+ if (stream.readBoolean()) {
+ this.memberNamespaces = new MapOfInt<>(this.space, stream);
+ }
+
+ if (stream.readBoolean()) {
+ this.memberClasstypes = new MapOfInt<>(this.space, stream);
+ }
+
+ if (stream.readBoolean()) {
+ this.memberFiles = new SetOfFileEntry(this.filespace, stream);
+ }
+
+ if (stream.readBoolean()) {
+ this.assemblies = new SetOfInt(stream);
+ }
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.identifier);
+ stream.writeInt(this.entity);
+ stream.writeInt(this.space.getID(this.enclosingNamespace));
+ stream.writeBoolean(this.exists);
+ stream.writeBoolean(this.memberNamespaces != null);
+ if (this.memberNamespaces != null) {
+ this.memberNamespaces.store(stream);
+ }
+
+ stream.writeBoolean(this.memberClasstypes != null);
+ if (this.memberClasstypes != null) {
+ this.memberClasstypes.store(stream);
+ }
+
+ stream.writeBoolean(this.memberFiles != null);
+ if (this.memberFiles != null) {
+ this.memberFiles.store(stream);
+ }
+
+ stream.writeBoolean(this.assemblies != null);
+ if (this.assemblies != null) {
+ this.assemblies.store(stream);
+ }
+ }
+
+ public void invalidate() {
+ if (this.memberFiles != null) {
+ this.memberFiles.clear();
+ }
+
+ if (this.memberClasstypes != null) {
+ this.memberClasstypes.clear();
+ }
+
+ if (this.assemblies != null) {
+ this.assemblies.clear();
+ }
+
+ this.exists = false;
+ this.memberClasstypesCaseInsensitive = null;
+ }
+
+ @Override
+ public int getIdentifier() {
+ return this.identifier;
+ }
+
+ protected void declareExists(FileEntry file) {
+ int assembly = file.getAssembly();
+
+ for(Namespace p = this.enclosingNamespace; p != null; p = p.enclosingNamespace) {
+ p.exists = true;
+ if (p.assemblies == null) {
+ p.assemblies = new SetOfInt();
+ }
+
+ p.assemblies.put(assembly);
+ }
+
+ if (this.memberFiles == null) {
+ this.memberFiles = new SetOfFileEntry(this.filespace);
+ }
+
+ this.memberFiles.put(file);
+ if (this.assemblies == null) {
+ this.assemblies = new SetOfInt();
+ }
+
+ this.assemblies.put(assembly);
+ this.exists = true;
+ }
+
+ protected void declareMemberClasstype(int identifier, ClassType classtype) {
+ if (this.memberClasstypes == null) {
+ this.memberClasstypes = new MapOfInt<>(this.space);
+ }
+
+ this.memberClasstypes.insert(identifier, classtype);
+ }
+
+ public Namespace getMemberNamespace(int identifier) {
+ if (this.memberNamespaces == null) {
+ this.memberNamespaces = new MapOfInt<>(this.space);
+ }
+
+ if (!this.memberNamespaces.contains(identifier)) {
+ Namespace p = new Namespace(this.space, this.identifiers, this.filespace, identifier, this);
+ this.memberNamespaces.put(identifier, p);
+ return p;
+ } else {
+ return this.memberNamespaces.get(identifier);
+ }
+ }
+
+ public Namespace getEnclosingNamespace() {
+ return this.enclosingNamespace;
+ }
+
+ @Override
+ public Language getLanguage() {
+ this.space.loadNamespaces();
+ return this.memberFiles != null && this.memberFiles.size() != 0 ? this.memberFiles.get().getLanguage() : this.filespace.getLanguages()[0];
+ }
+
+ public boolean isRoot() {
+ return this.enclosingNamespace == null;
+ }
+
+ public SetOf getAllMemberNamespaces() {
+ this.space.loadNamespaces();
+ SetOf pakages = new SetOf<>(this.space);
+ if (this.memberNamespaces != null) {
+ this.memberNamespaces.DEFAULT_ITERATOR.init();
+
+ while(this.memberNamespaces.DEFAULT_ITERATOR.hasMoreElements()) {
+ Namespace pakage = this.memberNamespaces.DEFAULT_ITERATOR.nextValue();
+ if (pakage.exists) {
+ pakages.put(pakage);
+ }
+ }
+ }
+
+ return pakages;
+ }
+
+ public SetOf getAllMemberClasstypes() {
+ this.space.loadNamespaces();
+ SetOf types = new SetOf<>(this.space);
+ if (this.memberClasstypes != null) {
+ this.memberClasstypes.DEFAULT_ITERATOR.init();
+
+ while(this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ ClassType classtype = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ types.put(classtype);
+ }
+ }
+
+ return types;
+ }
+
+ public SetOfFileEntry getAllMemberFiles() {
+ this.space.loadNamespaces();
+ return this.memberFiles == null ? new SetOfFileEntry(this.filespace) : this.memberFiles;
+ }
+
+ public SetOf getAllPartialClasstypes(FileEntry file, int identifier) {
+ this.space.loadNamespaces();
+ SetOf types = null;
+ if (this.memberClasstypes != null) {
+ this.memberClasstypes.DEFAULT_ITERATOR.init(identifier);
+
+ while(this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ ClassType classtype = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ if (classtype.isPartial() && classtype.isReferable(file)) {
+ if (types == null) {
+ types = new SetOf<>(this.space);
+ }
+
+ types.put(classtype);
+ }
+ }
+ }
+
+ return types;
+ }
+
+ public SetOfInt getAllAssemblies() {
+ return this.assemblies == null ? new SetOfInt() : this.assemblies;
+ }
+
+ public Entity accessMember(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) throws UnknownEntityException {
+ this.space.loadNamespaces();
+ ClassType type = this.tryAccessMemberClasstype(file, identifier, caseSensitive, parameterTypeCount, referingPackage);
+ return type != null ? type : this.accessMemberNamespace(file, identifier, caseSensitive);
+ }
+
+ public ClassType accessMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) throws UnknownEntityException {
+ this.space.loadNamespaces();
+ ClassType type = this.tryAccessMemberClasstype(file, identifier, caseSensitive, parameterTypeCount, referingPackage);
+ if (type != null) {
+ return type;
+ } else {
+ throw new UnknownEntityException();
+ }
+ }
+
+ private ClassType tryAccessMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) {
+ if (this.memberClasstypes == null) {
+ return null;
+ } else {
+ int lookupIdentifier = identifier;
+ MapOfInt lookupTypes = this.memberClasstypes;
+ if (!caseSensitive) {
+ if (this.memberClasstypesCaseInsensitive == null) {
+ this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
+ this.memberClasstypes.DEFAULT_ITERATOR.init();
+
+ while(this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
+ ClassType type = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ this.memberClasstypesCaseInsensitive.insert(ident, type);
+ }
+ }
+
+ lookupIdentifier = this.identifiers.toUpperCase(identifier);
+ lookupTypes = this.memberClasstypesCaseInsensitive;
+ }
+
+ ClassType foundtype = null;
+ if (lookupTypes.contains(lookupIdentifier)) {
+ lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
+
+ while(lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ ClassType type = lookupTypes.DEFAULT_ITERATOR.nextValue();
+ if (type.isApplicable(file, parameterTypeCount) && type.isVisible(referingPackage) && type.isReferable(file)) {
+ if (foundtype == null) {
+ foundtype = type;
+ } else if (!this.filespace.hasHigherPriority(file, foundtype.getFile(), type.getFile())
+ && this.filespace.hasHigherPriority(file, type.getFile(), foundtype.getFile())) {
+ foundtype = type;
+ }
+ }
+ }
+ }
+
+ return foundtype;
+ }
+ }
+
+ public boolean existsMemberClasstype(FileEntry file, int identifier, boolean caseSensitive, int parameterTypeCount, Namespace referingPackage) {
+ this.space.loadNamespaces();
+ if (this.memberClasstypes != null) {
+ int lookupIdentifier = identifier;
+ MapOfInt lookupTypes = this.memberClasstypes;
+ if (!caseSensitive) {
+ if (this.memberClasstypesCaseInsensitive == null) {
+ this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
+ this.memberClasstypes.DEFAULT_ITERATOR.init();
+
+ while (this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
+ ClassType type = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ this.memberClasstypesCaseInsensitive.insert(ident, type);
+ }
+ }
+
+ lookupIdentifier = this.identifiers.toUpperCase(identifier);
+ lookupTypes = this.memberClasstypesCaseInsensitive;
+ }
+
+ if (lookupTypes.contains(lookupIdentifier)) {
+ lookupTypes.DEFAULT_ITERATOR.init(lookupIdentifier);
+
+ while (lookupTypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ ClassType type = lookupTypes.DEFAULT_ITERATOR.nextValue();
+ if (type.isApplicable(file, parameterTypeCount) && type.isVisible(referingPackage) && type.isReferable(file)) {
+ return true;
+ }
+ }
+ }
+
+ }
+ return false;
+ }
+
+ public boolean existsMemberClasstype(int identifier, boolean caseSensitive) {
+ this.space.loadNamespaces();
+ if (this.memberClasstypes == null) {
+ return false;
+ } else {
+ int lookupIdentifier = identifier;
+ MapOfInt lookupTypes = this.memberClasstypes;
+ if (!caseSensitive) {
+ if (this.memberClasstypesCaseInsensitive == null) {
+ this.memberClasstypesCaseInsensitive = new MapOfInt<>(this.space);
+ this.memberClasstypes.DEFAULT_ITERATOR.init();
+
+ while(this.memberClasstypes.DEFAULT_ITERATOR.hasMoreElements()) {
+ int ident = this.identifiers.toUpperCase(this.memberClasstypes.DEFAULT_ITERATOR.nextKey());
+ ClassType type = this.memberClasstypes.DEFAULT_ITERATOR.nextValue();
+ this.memberClasstypesCaseInsensitive.insert(ident, type);
+ }
+ }
+
+ lookupIdentifier = this.identifiers.toUpperCase(identifier);
+ lookupTypes = this.memberClasstypesCaseInsensitive;
+ }
+
+ return lookupTypes.contains(lookupIdentifier);
+ }
+ }
+
+ public boolean existsMemberNamespace(FileEntry file, int identifier, boolean caseSensitive) {
+ this.space.loadNamespaces();
+ Namespace memberPakage = this.getMemberNamespace(identifier);
+ if (memberPakage.exists) {
+ SetOfInt assemblies = memberPakage.getAllAssemblies();
+ assemblies.DEFAULT_ITERATOR.init();
+
+ while(assemblies.DEFAULT_ITERATOR.hasMoreElements()) {
+ int assembly = assemblies.DEFAULT_ITERATOR.nextKey();
+ if (this.filespace.isReferableFrom(assembly, file.getAssembly())) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public Namespace accessMemberNamespace(FileEntry file, int identifier, boolean caseSensitive) throws UnknownEntityException {
+ this.space.loadNamespaces();
+ Namespace memberPakage = this.getMemberNamespace(identifier);
+ if (memberPakage.exists) {
+ SetOfInt assemblies = memberPakage.getAllAssemblies();
+ assemblies.DEFAULT_ITERATOR.init();
+
+ while(assemblies.DEFAULT_ITERATOR.hasMoreElements()) {
+ int assembly = assemblies.DEFAULT_ITERATOR.nextKey();
+ if (this.filespace.isReferableFrom(assembly, file.getAssembly())) {
+ return memberPakage;
+ }
+ }
+ }
+
+ throw new UnknownEntityException();
+ }
+
+ @Override
+ public int getID() {
+ return this.entity;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Operators.java b/cl/src/main/java/com/apkide/analysis/clm/api/Operators.java
similarity index 95%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Operators.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Operators.java
index 8c2ca5d..9053d4c 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Operators.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Operators.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public interface Operators {
int PLUS = 1;
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/ParameterType.java b/cl/src/main/java/com/apkide/analysis/clm/api/ParameterType.java
new file mode 100644
index 0000000..59e35b1
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ParameterType.java
@@ -0,0 +1,206 @@
+package com.apkide.analysis.clm.api;
+
+import static com.apkide.analysis.clm.api.TypeSemantic.*;
+
+import com.apkide.analysis.clm.api.collections.ListOf;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+import java.io.IOException;
+
+public final class ParameterType extends Type {
+ private int myID;
+ private final EntitySpace mySpace;
+ private final IdentifierSpace myIdentifiers;
+ private final FileSpace myFileSpace;
+ private FileEntry myFile;
+ private int myDeclarationNumber;
+ private int myLine;
+ private int myStartColumn;
+ private int myEndColumn;
+ private boolean myBoundsLoaded;
+ private ListOf myBoundTypes;
+ private int myIdentifier;
+ private int myNumber;
+ private ClassType myClassType;
+
+ protected ParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace fileSpace) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myIdentifiers = identifiers;
+ this.myFileSpace = fileSpace;
+ }
+
+ protected ParameterType(EntitySpace space, IdentifierSpace identifiers, FileSpace fileSpace, FileEntry file, int declarationNumber) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myIdentifiers = identifiers;
+ this.myFileSpace = fileSpace;
+ this.myID = space.declareEntity(this);
+ this.myFile = file;
+ this.myDeclarationNumber = declarationNumber;
+ this.myBoundsLoaded = false;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myLine = stream.readInt();
+ this.myStartColumn = stream.readInt();
+ this.myEndColumn = stream.readInt();
+ this.myID = stream.readInt();
+ this.myFile = this.myFileSpace.getFileEntry(stream.readInt());
+ this.myDeclarationNumber = stream.readInt();
+ this.myNumber = stream.readInt();
+ this.myIdentifier = stream.readInt();
+ this.myClassType = (ClassType)this.mySpace.getEntity(stream.readInt());
+ this.myBoundsLoaded = stream.readBoolean();
+ if (stream.readBoolean()) {
+ this.myBoundTypes = new ListOf<>(this.mySpace, stream);
+ }
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myLine);
+ stream.writeInt(this.myStartColumn);
+ stream.writeInt(this.myEndColumn);
+ stream.writeInt(this.myID);
+ stream.writeInt(this.myFile.getID());
+ stream.writeInt(this.myDeclarationNumber);
+ stream.writeInt(this.myNumber);
+ stream.writeInt(this.myIdentifier);
+ stream.writeInt(this.mySpace.getID(this.myClassType));
+ stream.writeBoolean(this.myBoundsLoaded);
+ stream.writeBoolean(this.myBoundTypes != null);
+ if (this.myBoundTypes != null) {
+ this.myBoundTypes.store(stream);
+ }
+ }
+
+ protected void invalidate() {
+ if (this.myBoundTypes != null) {
+ this.myBoundTypes.clear();
+ }
+
+ this.myBoundsLoaded = false;
+ }
+
+ protected void declarePositions(int line, int startColumn, int endColumn) {
+ this.myLine = line;
+ this.myStartColumn = startColumn;
+ this.myEndColumn = endColumn;
+ }
+
+ protected void declareSyntax(int identifier, ClassType classType, int number) {
+ this.myNumber = number;
+ this.myIdentifier = identifier;
+ this.myClassType = classType;
+ if (this.myBoundTypes == null) {
+ this.myBoundTypes = new ListOf<>(this.mySpace);
+ } else {
+ this.myBoundTypes.clear();
+ }
+ }
+
+ protected void declareBoundType(Type boundType) {
+ this.myBoundTypes.add(boundType);
+ this.myBoundsLoaded = true;
+ }
+
+ @Override
+ public FileEntry getFile() {
+ return this.myFile;
+ }
+
+ @Override
+ public int getDeclarationNumber() {
+ return this.myDeclarationNumber;
+ }
+
+ @Override
+ public ClassType getEnclosingClassType() {
+ return this.myClassType;
+ }
+
+ @Override
+ public ClassType getEnclosingTopLevelClassType() {
+ return this.myClassType.getEnclosingTopLevelClassType();
+ }
+
+ @Override
+ public int getIdentifierLine() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myLine;
+ }
+
+ @Override
+ public int getIdentifierEndColumn() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myEndColumn;
+ }
+
+ @Override
+ public int getIdentifierStartColumn() {
+ this.mySpace.loadPositions(this.myFile);
+ return this.myStartColumn;
+ }
+
+ public int getBoundTypeCount() {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() != 0 ? this.myBoundTypes.size() : 1;
+ }
+
+ public int getNumber() {
+ return this.myNumber;
+ }
+
+ public int getAbsoluteNumber() {
+ return this.myClassType.getAbsoluteParametertypeCount() - this.myClassType.getParametertypeCount() + this.getNumber();
+ }
+
+ public Type getBoundType(int number) throws UnknownEntityException {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() > 0 ? this.myBoundTypes.get(number) : this.mySpace.getRootClasstype(this.myFile);
+ }
+
+ @Override
+ public Type getErasedType() throws UnknownEntityException {
+ this.loadBounds();
+ return this.myBoundTypes != null && this.myBoundTypes.size() > 0 ? this.myBoundTypes.get(0) : this.mySpace.getRootClasstype(this.myFile);
+ }
+
+ public ClassType getClassType() {
+ return this.myClassType;
+ }
+
+ @Override
+ public int getIdentifier() {
+ return this.myIdentifier;
+ }
+
+ @Override
+ public int getID() {
+ return this.myID;
+ }
+
+ private void loadBoundTypes() {
+ if (!this.myBoundsLoaded) {
+ this.myBoundsLoaded = true;
+ if (this.myBoundTypes != null) {
+ this.mySpace.loadBoundTypes(this.myFile, this.myClassType);
+ }
+ }
+ }
+
+ private void loadBounds() {
+ if (!this.myBoundsLoaded) {
+ this.myClassType.getAllSuperTypes();
+ if (this.myClassType.areSuperClasstypesLoaded()) {
+ this.loadBoundTypes();
+ }
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/ParameterizedType.java b/cl/src/main/java/com/apkide/analysis/clm/api/ParameterizedType.java
new file mode 100644
index 0000000..956a1c4
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ParameterizedType.java
@@ -0,0 +1,314 @@
+package com.apkide.analysis.clm.api;
+
+import static com.apkide.analysis.clm.api.TypeSemantic.UNKNOWN_SEMANTIC;
+import static com.apkide.analysis.clm.api.Variance.*;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.AmbiguousEntityException;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
+
+import java.io.IOException;
+
+public final class ParameterizedType extends Type {
+ private final EntitySpace mySpace;
+ private int myID;
+ private ClassType myClassType;
+ private Type[] myAbsoluteArgumentTypes;
+ private int[] myAbsoluteArgumentVariances;
+ private SetOf myAllSuperTypes;
+
+ protected ParameterizedType(EntitySpace space) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ }
+
+ protected ParameterizedType(EntitySpace space, ClassType classtype, Type[] absoluteArgumentTypes, int[] absoluteArgumentVariances) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myID = space.declareEntity(this);
+ this.myClassType = classtype;
+ this.myAbsoluteArgumentTypes = absoluteArgumentTypes;
+ this.myAbsoluteArgumentVariances = absoluteArgumentVariances;
+ this.myAllSuperTypes = null;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myID = stream.readInt();
+ this.myClassType = (ClassType)this.mySpace.getEntity(stream.readInt());
+ int count = stream.readInt();
+ this.myAbsoluteArgumentTypes = new Type[count];
+ this.myAbsoluteArgumentVariances = new int[count];
+
+ for(int i = 0; i < this.myAbsoluteArgumentTypes.length; ++i) {
+ this.myAbsoluteArgumentTypes[i] = (Type)this.mySpace.getEntity(stream.readInt());
+ this.myAbsoluteArgumentVariances[i] = stream.readInt();
+ }
+
+ if (stream.readBoolean()) {
+ this.myAllSuperTypes = new SetOf<>(this.mySpace, stream);
+ }
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myID);
+ stream.writeInt(this.mySpace.getID(this.myClassType));
+ stream.writeInt(this.myAbsoluteArgumentTypes.length);
+
+ for(int i = 0; i < this.myAbsoluteArgumentTypes.length; ++i) {
+ stream.writeInt(this.mySpace.getID(this.myAbsoluteArgumentTypes[i]));
+ stream.writeInt(this.myAbsoluteArgumentVariances[i]);
+ }
+
+ stream.writeBoolean(this.myAllSuperTypes != null);
+ if (this.myAllSuperTypes != null) {
+ this.myAllSuperTypes.store(stream);
+ }
+ }
+
+ public void invalidate() {
+ this.myAllSuperTypes = null;
+ }
+
+ public Type[] getAbsoluteArgumentTypes() {
+ return this.myAbsoluteArgumentTypes;
+ }
+
+ public int[] getAbsoluteArgumentVariances() {
+ return this.myAbsoluteArgumentVariances;
+ }
+
+ @Override
+ public boolean isInterfaceType() {
+ return this.getClassType().isInterfaceType();
+ }
+
+ @Override
+ public FileEntry getFile() {
+ return this.getClassType().getFile();
+ }
+
+ @Override
+ public boolean isSealedType() {
+ return this.getClassType().isSealedType();
+ }
+
+ @Override
+ public boolean isDelegateType() {
+ return this.getClassType().isDelegateType();
+ }
+
+ @Override
+ public boolean isStructType() {
+ return this.getClassType().isStructType();
+ }
+
+ @Override
+ public boolean isEnumType() {
+ return this.getClassType().isEnumType();
+ }
+
+ @Override
+ public Type accessMemberType(int identifier, boolean caseSensitive, int parameterCount, Entity referingClassTypeOrPackage, FileEntry file) throws UnknownEntityException, AmbiguousEntityException {
+ ClassType classtype = this.getClassType();
+ Type member = classtype.accessMemberType(identifier, caseSensitive, parameterCount, referingClassTypeOrPackage, file);
+ if (member.isClassType())
+ member = ((ClassType)member).parameterizeCanonical();
+
+ return this.replaceType(member);
+ }
+
+ public Type parameterize(Type[] argumentTypes) {
+ int[] variances = new int[argumentTypes.length];
+ return this.parameterize(argumentTypes, variances);
+ }
+
+ public Type parameterize(Type[] argumentTypes, int[] variances) {
+ ClassType classType = this.getClassType();
+ int len = classType.getParametertypeCount();
+ int absoluteLen = classType.getAbsoluteParametertypeCount();
+ if (len < absoluteLen) {
+ Type[] oldArgTypes = this.getAbsoluteArgumentTypes();
+ int[] oldVariances = this.getAbsoluteArgumentVariances();
+ Type[] absoluteArgumentTypes = new Type[absoluteLen];
+ int[] absoluteVariances = new int[absoluteLen];
+
+ for(int i = 0; i < absoluteLen - len; ++i) {
+ absoluteArgumentTypes[i] = oldArgTypes[i];
+ absoluteVariances[i] = oldVariances[i];
+ }
+
+ for(int i = absoluteLen - len; i < absoluteLen; ++i) {
+ absoluteArgumentTypes[i] = argumentTypes[i - absoluteLen + len];
+ absoluteVariances[i] = variances[i - absoluteLen + len];
+ }
+
+ argumentTypes = absoluteArgumentTypes;
+ variances = absoluteVariances;
+ }
+
+ return this.mySpace.getParameterizedtype(classType, argumentTypes, variances);
+ }
+
+ public SetOf getAllSuperTypes() {
+ if (this.myAllSuperTypes == null) {
+ this.myAllSuperTypes = new SetOf<>(this.mySpace);
+ SetOf allSuperTypesOfClassType = this.myClassType.getAllSuperTypes();
+ allSuperTypesOfClassType.DEFAULT_ITERATOR.init();
+
+ while(allSuperTypesOfClassType.DEFAULT_ITERATOR.hasMoreElements()) {
+ try {
+ this.myAllSuperTypes.put(this.replaceType(allSuperTypesOfClassType.DEFAULT_ITERATOR.nextKey()));
+ } catch (UnknownEntityException ignored) {
+ }
+ }
+ }
+
+ return this.myAllSuperTypes;
+ }
+
+ public Type replaceType(Type type) throws UnknownEntityException {
+ return this.replaceType(type, true);
+ }
+
+ public Type replaceType(Type type, boolean readAccess) throws UnknownEntityException {
+ if (type.isArrayType()) {
+ return this.mySpace.getArraytype(this.replaceType(((ArrayType)type).getElementType()), ((ArrayType)type).getDimension());
+ } else if (type.isParameterType()) {
+ for(int i = 0; i < this.myAbsoluteArgumentTypes.length; ++i) {
+ try {
+ if (this.myClassType.getAbsoluteParametertype(i) == type)
+ return this.myAbsoluteArgumentTypes[i];
+
+ } catch (UnknownEntityException ignored) {
+ }
+ }
+
+ return type;
+ } else if (!type.isParameterizedType()) {
+ return type;
+ } else {
+ Type[] memberArgumentTypes = ((ParameterizedType)type).getAbsoluteArgumentTypes();
+ int[] memberVariances = ((ParameterizedType)type).getAbsoluteArgumentVariances();
+ int[] replacedVariances = new int[memberArgumentTypes.length];
+ Type[] replacedTypes = new Type[memberArgumentTypes.length];
+
+
+ for(int i = 0; i < memberArgumentTypes.length; ++i) {
+ Type memberType = memberArgumentTypes[i];
+
+ for(int j = 0; j < this.myAbsoluteArgumentTypes.length; ++j) {
+ if (this.myClassType.getAbsoluteParametertype(j) == memberType) {
+ Type argumentBoundType = this.myClassType.getAbsoluteParametertype(j).getErasedType();
+ replacedTypes[i] = this.myAbsoluteArgumentTypes[j];
+ switch(memberVariances[i]) {
+ case INVARIANCE:
+ if (readAccess) {
+ replacedVariances[i] = this.myAbsoluteArgumentVariances[j];
+ } else {
+ switch(this.myAbsoluteArgumentVariances[j]) {
+ case INVARIANCE:
+ replacedVariances[i] = this.myAbsoluteArgumentVariances[j];
+ break;
+ case BIVARIANCE:
+ case COVARIANCE:
+ case CONTRAVARIANCE:
+ throw new UnknownEntityException();
+ }
+ }
+ break;
+ case BIVARIANCE:
+ case COVARIANCE:
+ if (readAccess) {
+ switch(this.myAbsoluteArgumentVariances[j]) {
+ case INVARIANCE:
+ case BIVARIANCE:
+ case 2:
+ replacedVariances[i] = COVARIANCE;
+ if (argumentBoundType == this.myAbsoluteArgumentTypes[j]) {
+ replacedVariances[i] = BIVARIANCE;
+ }
+ break;
+ case CONTRAVARIANCE:
+ replacedVariances[i] = BIVARIANCE;
+ replacedTypes[i] = argumentBoundType;
+ }
+ } else {
+ switch(this.myAbsoluteArgumentVariances[j]) {
+ case INVARIANCE:
+ case CONTRAVARIANCE:
+ replacedVariances[i] = COVARIANCE;
+ if (argumentBoundType == this.myAbsoluteArgumentTypes[j]) {
+ replacedVariances[i] = BIVARIANCE;
+ }
+ break;
+ case BIVARIANCE:
+ case COVARIANCE:
+ throw new UnknownEntityException();
+ }
+ }
+ break;
+ case CONTRAVARIANCE:
+ if (readAccess) {
+ switch(this.myAbsoluteArgumentVariances[j]) {
+ case INVARIANCE:
+ case CONTRAVARIANCE:
+ replacedVariances[i] = CONTRAVARIANCE;
+ if (argumentBoundType == this.myAbsoluteArgumentTypes[j]) {
+ replacedVariances[i] = INVARIANCE;
+ }
+ break;
+ case BIVARIANCE:
+ case COVARIANCE:
+ replacedVariances[i] = BIVARIANCE;
+ replacedTypes[i] = argumentBoundType;
+ }
+ } else {
+ switch(this.myAbsoluteArgumentVariances[j]) {
+ case INVARIANCE:
+ case BIVARIANCE:
+ case COVARIANCE:
+ replacedVariances[i] = CONTRAVARIANCE;
+ if (argumentBoundType == this.myAbsoluteArgumentTypes[j]) {
+ replacedVariances[i] = INVARIANCE;
+ }
+ break;
+ case CONTRAVARIANCE:
+ replacedVariances[i] = INVARIANCE;
+ replacedTypes[i] = argumentBoundType;
+ }
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ replacedTypes[i] = this.replaceType(memberType, readAccess);
+ replacedVariances[i] = memberVariances[i];
+ }
+
+ return this.mySpace.getParameterizedtype(((ParameterizedType)type).getClassType(), replacedTypes, replacedVariances);
+ }
+ }
+
+ public ClassType getClassType() {
+ return this.myClassType;
+ }
+
+ @Override
+ public int getID() {
+ return this.myID;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return this.getClassType().getLanguage();
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/PointerType.java b/cl/src/main/java/com/apkide/analysis/clm/api/PointerType.java
new file mode 100644
index 0000000..9c63af5
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/PointerType.java
@@ -0,0 +1,55 @@
+package com.apkide.analysis.clm.api;
+
+import static com.apkide.analysis.clm.api.TypeSemantic.*;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+
+public final class PointerType extends Type {
+ private final EntitySpace mySpace;
+ private int myID;
+ private Type myType;
+
+ protected PointerType(EntitySpace space) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ }
+
+ protected PointerType(EntitySpace space, Type type) {
+ super(space, UNKNOWN_SEMANTIC);
+ this.mySpace = space;
+ this.myID = space.declareEntity(this);
+ this.myType = type;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myID = stream.readInt();
+ this.myType = (Type)this.mySpace.getEntity(stream.readInt());
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myID);
+ stream.writeInt(this.mySpace.getID(this.myType));
+ }
+
+ public Type getType() {
+ return this.myType;
+ }
+
+ @Override
+ public int getID() {
+ return this.myID;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return this.getType().getLanguage();
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/PrimitiveType.java b/cl/src/main/java/com/apkide/analysis/clm/api/PrimitiveType.java
new file mode 100644
index 0000000..613b70b
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/PrimitiveType.java
@@ -0,0 +1,52 @@
+package com.apkide.analysis.clm.api;
+
+import com.apkide.analysis.clm.Language;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+
+import java.io.IOException;
+
+public final class PrimitiveType extends Type {
+ private final FileSpace myFileSpace;
+ private final EntitySpace mySpace;
+ private int myEntity;
+ private int myLanguageID;
+
+ protected PrimitiveType(EntitySpace space, FileSpace fileSpace, int semantic, Language language) {
+ super(space, semantic);
+ this.myFileSpace = fileSpace;
+ this.mySpace = space;
+ this.myLanguageID = fileSpace.getLanguageID(language);
+ this.myEntity = space.declareEntity(this);
+ }
+
+ protected PrimitiveType(EntitySpace space, FileSpace filespace) {
+ super(space);
+ this.myFileSpace = filespace;
+ this.mySpace = space;
+ }
+
+ @Override
+ protected void load(StoreInputStream stream) throws IOException {
+ super.load(stream);
+ this.myEntity = stream.readInt();
+ this.myLanguageID = stream.readInt();
+ }
+
+ @Override
+ protected void store(StoreOutputStream stream) throws IOException {
+ super.store(stream);
+ stream.writeInt(this.myEntity);
+ stream.writeInt(this.myLanguageID);
+ }
+
+ @Override
+ public int getID() {
+ return this.myEntity;
+ }
+
+ @Override
+ public Language getLanguage() {
+ return this.myFileSpace.getLanguage(this.myLanguageID);
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ReferenceKind.java b/cl/src/main/java/com/apkide/analysis/clm/api/ReferenceKind.java
similarity index 96%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/ReferenceKind.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/ReferenceKind.java
index c0712d1..6fcd7b0 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/ReferenceKind.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/ReferenceKind.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public interface ReferenceKind {
int UNKNOWN_KIND = 0;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTree.java b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTree.java
similarity index 94%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTree.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTree.java
index a48f4ff..15b0b68 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTree.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTree.java
@@ -1,8 +1,9 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-
-import com.apkide.analysis.api.cle.Syntax;
-import com.apkide.common.collections.SetOfInt;
+import com.apkide.analysis.clm.SignatureAnalyzer;
+import com.apkide.analysis.clm.Syntax;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
+import com.apkide.analysis.clm.api.collections.SetOfInt;
public class SyntaxTree {
private static final int MINCOMMENTS = 100;
@@ -355,11 +356,11 @@ public int declareNode(int syntaxTag, boolean synthetic, int[] childItems, int o
}
public long memSize() {
- return (long)(this.contentpos * 4 + this.attributepos * 4);
+ return this.contentpos * 4L + this.attributepos * 4L;
}
public long totalSize() {
- return (long)(this.content.length * 4 + this.attributes.length * 4);
+ return this.content.length * 4L + this.attributes.length * 4L;
}
public void clear() {
@@ -387,7 +388,7 @@ public long getDeclarationDigest() {
if (this.decldigest != -1L) {
return this.decldigest;
} else {
- SignatureAnalyzerAbstraction signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
+ SignatureAnalyzer signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
if (signatureAnalyzer == null) {
return 0L;
} else {
@@ -401,7 +402,7 @@ public long getPublicDeclarationDigest() {
if (this.publicDecldigest != -1L) {
return this.publicDecldigest;
} else {
- SignatureAnalyzerAbstraction signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
+ SignatureAnalyzer signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
if (signatureAnalyzer == null) {
return 0L;
} else {
@@ -415,7 +416,7 @@ public long getClassDeclarationDigest() {
if (this.classdecldigest != -1L) {
return this.classdecldigest;
} else {
- SignatureAnalyzerAbstraction signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
+ SignatureAnalyzer signatureAnalyzer = this.file.getLanguage().getSignatureAnalyzer();
if (signatureAnalyzer == null) {
return 0L;
} else {
@@ -731,20 +732,14 @@ public boolean commentContainsPosition(int comment, int line, int column) {
return false;
}
- if (column >= this.getCommentEndColumn(comment)) {
- return false;
- }
+ return column < this.getCommentEndColumn(comment);
} else {
if (line == this.getCommentStartLine(comment) && column < this.getCommentStartColumn(comment)) {
return false;
}
- if (line == this.getCommentEndLine(comment) && column >= this.getCommentEndColumn(comment)) {
- return false;
- }
+ return line != this.getCommentEndLine(comment) || column < this.getCommentEndColumn(comment);
}
-
- return true;
}
}
@@ -761,20 +756,14 @@ public boolean containsPosition(int node, int line, int column) {
return false;
}
- if (column >= this.getEndColumn(node)) {
- return false;
- }
+ return column < this.getEndColumn(node);
} else {
if (line == this.getStartLine(node) && column < this.getStartColumn(node)) {
return false;
}
- if (line == this.getEndLine(node) && column >= this.getEndColumn(node)) {
- return false;
- }
+ return line != this.getEndLine(node) || column < this.getEndColumn(node);
}
-
- return true;
}
}
@@ -791,20 +780,14 @@ public boolean containsPositionIn(int node, int line, int column) {
return false;
}
- if (column >= this.getEndColumn(node)) {
- return false;
- }
+ return column < this.getEndColumn(node);
} else {
if (line == this.getStartLine(node) && column <= this.getStartColumn(node)) {
return false;
}
- if (line == this.getEndLine(node) && column >= this.getEndColumn(node)) {
- return false;
- }
+ return line != this.getEndLine(node) || column < this.getEndColumn(node);
}
-
- return true;
}
}
@@ -819,20 +802,14 @@ public boolean containsPositionExt(int node, int line, int column) {
return false;
}
- if (column > this.getEndColumn(node)) {
- return false;
- }
+ return column <= this.getEndColumn(node);
} else {
if (line == this.getStartLine(node) && column < this.getStartColumn(node)) {
return false;
}
- if (line == this.getEndLine(node) && column > this.getEndColumn(node)) {
- return false;
- }
+ return line != this.getEndLine(node) || column <= this.getEndColumn(node);
}
-
- return true;
}
}
@@ -936,7 +913,7 @@ public ListOfInt getBlockStatementNodesAt(int startLine, int startColumn, int en
for(startStmtNum = 1; startStmtNum < count - 1; ++startStmtNum) {
int stmtNode = this.getChildNode(blockNode, startStmtNum);
- if (startStmtNode == -1 && (this.containsPosition(stmtNode, startLine, startColumn) || this.afterPosition(stmtNode, startLine, startColumn))) {
+ if (this.containsPosition(stmtNode, startLine, startColumn) || this.afterPosition(stmtNode, startLine, startColumn)) {
startStmtNode = stmtNode;
break;
}
@@ -944,7 +921,7 @@ public ListOfInt getBlockStatementNodesAt(int startLine, int startColumn, int en
for(endStmtNum = count - 2; endStmtNum > 0; --endStmtNum) {
int stmtNode = this.getChildNode(blockNode, endStmtNum);
- if (endStmtNode == -1 && (this.containsPosition(stmtNode, endLine, endColumn) || this.beforePosition(stmtNode, endLine, endColumn))) {
+ if (this.containsPosition(stmtNode, endLine, endColumn) || this.beforePosition(stmtNode, endLine, endColumn)) {
endStmtNode = stmtNode;
break;
}
@@ -1005,7 +982,7 @@ public ListOfInt getMemberNodesAt(int startLine, int startColumn, int endLine, i
for(startMbrNum = 1; startMbrNum < count - 1; ++startMbrNum) {
int mbrNode = this.getChildNode(bodyNode, startMbrNum);
- if (startMbrNode == -1 && (this.containsPosition(mbrNode, startLine, startColumn) || this.afterPosition(mbrNode, startLine, startColumn))) {
+ if (this.containsPosition(mbrNode, startLine, startColumn) || this.afterPosition(mbrNode, startLine, startColumn)) {
startMbrNode = mbrNode;
break;
}
@@ -1013,7 +990,7 @@ public ListOfInt getMemberNodesAt(int startLine, int startColumn, int endLine, i
for(endMbrNum = count - 2; endMbrNum > 0; --endMbrNum) {
int mbrNode = this.getChildNode(bodyNode, endMbrNum);
- if (endMbrNode == -1 && (this.containsPosition(mbrNode, endLine, endColumn) || this.beforePosition(mbrNode, endLine, endColumn))) {
+ if (this.containsPosition(mbrNode, endLine, endColumn) || this.beforePosition(mbrNode, endLine, endColumn)) {
endMbrNode = mbrNode;
break;
}
@@ -1444,34 +1421,33 @@ private void createString(StringBuffer buffer, String tabs, int node) {
+ ") "
+ node
+ " ";
- if (pos.length() > 25) {
- pos = pos.substring(0, 25);
- }
+ pos.length();
+ pos = pos.substring(0, 25);
if (this.syntax.isIdentifier(this.getSyntaxTag(node))) {
- buffer.append(pos + tabs + this.getIdentifierString(node));
+ buffer.append(pos).append(tabs).append(this.getIdentifierString(node));
} else if (this.syntax.isLiteral(this.getSyntaxTag(node))) {
- buffer.append(pos + tabs + this.getLiteralString(node));
+ buffer.append(pos).append(tabs).append(this.getLiteralString(node));
} else {
- buffer.append(pos + tabs + this.syntax.getString(this.getSyntaxTag(node)));
+ buffer.append(pos).append(tabs).append(this.syntax.getString(this.getSyntaxTag(node)));
}
if (this.syntax != null) {
for(int i = 0; i < this.getAttributeCount(this.getSyntaxTag(node)); ++i) {
- buffer.append(" " + this.getAttribute(node, i));
+ buffer.append(" ").append(this.getAttribute(node, i));
}
}
if (this.isClassDeclarationNode(node)) {
- buffer.append(" " + this.getDeclarationNumber(node));
+ buffer.append(" ").append(this.getDeclarationNumber(node));
}
if (this.isMethodDeclarationNode(node)) {
- buffer.append(" " + this.getDeclarationNumber(node));
+ buffer.append(" ").append(this.getDeclarationNumber(node));
}
if (this.isFieldDeclarationNode(node)) {
- buffer.append(" " + this.getDeclarationNumber(node));
+ buffer.append(" ").append(this.getDeclarationNumber(node));
}
if (this.isSyntheticNode(node)) {
@@ -1572,7 +1548,7 @@ private int getAttribute(int node, int attr) {
}
if (ap + attr > this.attributes.length) {
- System.out.println("");
+ System.out.println();
}
return this.attributes[ap + attr];
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePool.java b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePool.java
similarity index 96%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePool.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePool.java
index 9479a67..ed4ff5e 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePool.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePool.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public class SyntaxTreePool {
public static final Object LOCK_ENGINE_COMPLETION = new Object();
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePositionMaintainer.java b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePositionMaintainer.java
similarity index 98%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePositionMaintainer.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePositionMaintainer.java
index d00325b..a76560b 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreePositionMaintainer.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreePositionMaintainer.java
@@ -1,7 +1,6 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
-
-import com.apkide.common.collections.ListOfInt;
+import com.apkide.analysis.clm.api.collections.ListOfInt;
public class SyntaxTreePositionMaintainer {
private ListOfInt positions = new ListOfInt();
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreeSpace.java b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreeSpace.java
similarity index 91%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreeSpace.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreeSpace.java
index 704b73d..d9271fa 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/SyntaxTreeSpace.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/SyntaxTreeSpace.java
@@ -1,11 +1,10 @@
-package com.apkide.analysis.api.clm;
-
-import com.apkide.analysis.api.clm.collections.SetOfFileEntry;
-import com.apkide.analysis.api.clm.util.TimeUtils;
-import com.apkide.common.collections.FunctionOfIntInt;
-import com.apkide.common.collections.FunctionOfIntLong;
-import com.apkide.common.collections.HashtableOfInt;
+package com.apkide.analysis.clm.api;
+import com.apkide.analysis.clm.api.collections.FunctionOfIntInt;
+import com.apkide.analysis.clm.api.collections.FunctionOfIntLong;
+import com.apkide.analysis.clm.api.collections.HashtableOfInt;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+import com.apkide.analysis.clm.api.util.TimeUtils;
public class SyntaxTreeSpace {
private static final long MAX_CACHE_SIZE = 10000000L;
@@ -35,7 +34,7 @@ protected void update() {
while(this.asts.DEFAULT_ITERATOR.hasMoreElements()) {
FileEntry file = this.filespace.getFileEntry(this.asts.DEFAULT_ITERATOR.nextKey());
- SyntaxTree ast = (SyntaxTree)this.asts.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree ast = this.asts.DEFAULT_ITERATOR.nextValue();
if (file.getSyntaxVersion() != ast.getVersion()) {
ast.clear();
} else {
@@ -47,7 +46,7 @@ protected void update() {
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
FileEntry file = this.filespace.getFileEntry(this.astfrees.DEFAULT_ITERATOR.nextKey());
- SyntaxTree ast = (SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree ast = this.astfrees.DEFAULT_ITERATOR.nextValue();
if (file.getSyntaxVersion() != ast.getVersion()) {
ast.clear();
} else {
@@ -167,7 +166,7 @@ private SyntaxTree getSyntaxTree(FileEntry file, boolean parseCode, boolean pars
this.astfrees.DEFAULT_ITERATOR.init();
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
- SyntaxTree cacheast = (SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree cacheast = this.astfrees.DEFAULT_ITERATOR.nextValue();
FileEntry cachef = this.filespace.getFileEntry(this.astfrees.DEFAULT_ITERATOR.nextKey());
if (SyntaxTreePool.SHARED_ENGINE.memSize() < cacheast.totalSize() && (ast == null || ast.totalSize() > cacheast.totalSize())) {
f = cachef;
@@ -179,7 +178,7 @@ private SyntaxTree getSyntaxTree(FileEntry file, boolean parseCode, boolean pars
this.astfrees.DEFAULT_ITERATOR.init();
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
- SyntaxTree cacheast = (SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree cacheast = this.astfrees.DEFAULT_ITERATOR.nextValue();
FileEntry cachefile = this.filespace.getFileEntry(this.astfrees.DEFAULT_ITERATOR.nextKey());
if (SyntaxTreePool.SHARED_ENGINE.memSize() < cacheast.totalSize() && (ast == null || ast.totalSize() > cacheast.totalSize())) {
f = cachefile;
@@ -195,7 +194,7 @@ private SyntaxTree getSyntaxTree(FileEntry file, boolean parseCode, boolean pars
this.astfrees.DEFAULT_ITERATOR.init();
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
- SyntaxTree cacheast = (SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree cacheast = this.astfrees.DEFAULT_ITERATOR.nextValue();
FileEntry cachefile = this.filespace.getFileEntry(this.astfrees.DEFAULT_ITERATOR.nextKey());
if (largestsize < cacheast.totalSize()) {
largestfile = cachefile;
@@ -239,7 +238,7 @@ protected void releaseSyntaxTrees() {
while(this.asts.DEFAULT_ITERATOR.hasMoreElements()) {
FileEntry file = this.filespace.getFileEntry(this.asts.DEFAULT_ITERATOR.nextKey());
- SyntaxTree ast = (SyntaxTree)this.asts.DEFAULT_ITERATOR.nextValue();
+ SyntaxTree ast = this.asts.DEFAULT_ITERATOR.nextValue();
this.astfrees.put(file.getID(), ast);
this.astfreefiles.put(file);
}
@@ -299,7 +298,7 @@ private void compact(long allowedMemSize) {
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
int fileid = this.astfrees.DEFAULT_ITERATOR.nextKey();
- long size = ((SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue()).memSize();
+ long size = this.astfrees.DEFAULT_ITERATOR.nextValue().memSize();
long time = this.lastAcessTimes.get(fileid);
if (size > 0L && time > 0L) {
this.fileIDs[f] = fileid;
@@ -319,8 +318,6 @@ private void compact(long allowedMemSize) {
}
}
- if (oldMemSize != memSize) {
- }
}
private void sortFiles(int i, int j) {
@@ -361,13 +358,13 @@ public long memSize() {
this.asts.DEFAULT_ITERATOR.init();
while(this.asts.DEFAULT_ITERATOR.hasMoreElements()) {
- memSize += ((SyntaxTree)this.asts.DEFAULT_ITERATOR.nextValue()).memSize();
+ memSize += this.asts.DEFAULT_ITERATOR.nextValue().memSize();
}
this.astfrees.DEFAULT_ITERATOR.init();
while(this.astfrees.DEFAULT_ITERATOR.hasMoreElements()) {
- memSize += ((SyntaxTree)this.astfrees.DEFAULT_ITERATOR.nextValue()).memSize();
+ memSize += this.astfrees.DEFAULT_ITERATOR.nextValue().memSize();
}
return memSize;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Type.java b/cl/src/main/java/com/apkide/analysis/clm/api/Type.java
similarity index 65%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Type.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Type.java
index 3979999..e105b79 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Type.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Type.java
@@ -1,16 +1,17 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
+import static com.apkide.analysis.clm.api.TypeSemantic.UNKNOWN_SEMANTIC;
+import static com.apkide.analysis.clm.api.Variance.BIVARIANCE;
+import static com.apkide.analysis.clm.api.Variance.CONTRAVARIANCE;
+import static com.apkide.analysis.clm.api.Variance.COVARIANCE;
+import static com.apkide.analysis.clm.api.Variance.INVARIANCE;
-import static com.apkide.analysis.api.clm.TypeSemantic.UNKNOWN_SEMANTIC;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.collections.MapOfInt;
-import com.apkide.analysis.api.clm.collections.SetOf;
-import com.apkide.analysis.api.clm.excpetions.AmbiguousEntityException;
-import com.apkide.analysis.api.clm.excpetions.UnknownEntityException;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
+import com.apkide.analysis.clm.api.collections.MapOfInt;
+import com.apkide.analysis.clm.api.collections.SetOf;
+import com.apkide.analysis.clm.api.collections.StoreInputStream;
+import com.apkide.analysis.clm.api.collections.StoreOutputStream;
+import com.apkide.analysis.clm.api.excpetions.AmbiguousEntityException;
+import com.apkide.analysis.clm.api.excpetions.UnknownEntityException;
import java.io.IOException;
@@ -18,14 +19,14 @@ public class Type extends Entity {
private final EntitySpace mySpace;
private int mySemantic;
- protected Type(FileSpace fileSpace,EntitySpace space, int semantic) {
- super(fileSpace, space);
+ public Type(EntitySpace space, int semantic) {
+ super(space);
this.mySpace = space;
this.mySemantic = semantic;
}
- protected Type(FileSpace fileSpace,EntitySpace space) {
- super(fileSpace, space);
+ public Type(EntitySpace space) {
+ super(space);
this.mySpace = space;
}
@@ -39,6 +40,7 @@ public Type accessSuperFields(FileEntry file, int identifier, boolean caseSensit
superType.accessFields(file, identifier, caseSensitive, (ClassType) superType.getErasedType(), fields);
} catch (UnknownEntityException ignored) {
}
+
return this;
}
@@ -48,6 +50,7 @@ public Type accessSuperMethods(FileEntry file, int identifier, boolean caseSensi
superType.accessMethods(file, identifier, caseSensitive, (ClassType) superType.getErasedType(), methods);
} catch (UnknownEntityException ignored) {
}
+
return this;
}
@@ -66,21 +69,20 @@ public Type accessMethods(FileEntry file, int identifier, boolean caseSensitive,
} else {
try {
if (this.isArrayType()) {
- ClassType arraySuperClassType = this.mySpace.getArraySuperClasstype(file,getLanguage());
+ ClassType arraySuperClassType = this.mySpace.getArraySuperClasstype(file);
return arraySuperClassType.accessMethods(file, identifier, caseSensitive, arraySuperClassType, methods);
} else if (this.isParameterType()) {
if (((ParameterType) this).getBoundTypeCount() == 1) {
return this.getErasedType().accessMethods(file, identifier, caseSensitive, referingClassType, methods);
} else {
- return this.mySpace.getRootClasstype(file,getLanguage()).accessMethods(file, identifier, caseSensitive, referingClassType, methods);
+ return this.mySpace.getRootClasstype(file).accessMethods(file, identifier, caseSensitive, referingClassType, methods);
}
} else if (this.isMethodParameterType()) {
if (((MethodParameterType) this).getBoundTypeCount() == 1) {
return this.getErasedType().accessMethods(file, identifier, caseSensitive, referingClassType, methods);
} else {
- return this.mySpace.getRootClasstype(file,getLanguage()).accessMethods(file, identifier, caseSensitive, referingClassType, methods);
+ return this.mySpace.getRootClasstype(file).accessMethods(file, identifier, caseSensitive, referingClassType, methods);
}
-
}
} catch (UnknownEntityException ignored) {
}
@@ -95,20 +97,20 @@ public Type accessFields(FileEntry file, int identifier, boolean caseSensitive,
} else {
try {
if (this.isArrayType()) {
- ClassType arraySuperClassType = this.mySpace.getArraySuperClasstype(file,getLanguage());
+ ClassType arraySuperClassType = this.mySpace.getArraySuperClasstype(file);
return arraySuperClassType.accessFields(file, identifier, caseSensitive, arraySuperClassType, fields);
} else if (this.isParameterType()) {
- if (((ParameterType) this).getBoundTypeCount() == 1) {
+ if (((ParameterType) this).getBoundTypeCount() == 1)
return this.getErasedType().accessFields(file, identifier, caseSensitive, referingClassType, fields);
- } else {
- return this.mySpace.getRootClasstype(file,getLanguage()).accessFields(file, identifier, caseSensitive, referingClassType, fields);
- }
+ else
+ return this.mySpace.getRootClasstype(file).accessFields(file, identifier, caseSensitive, referingClassType, fields);
+
} else if (this.isMethodParameterType()) {
- if (((MethodParameterType) this).getBoundTypeCount() == 1) {
+ if (((MethodParameterType) this).getBoundTypeCount() == 1)
return this.getErasedType().accessFields(file, identifier, caseSensitive, referingClassType, fields);
- } else {
- return this.mySpace.getRootClasstype(file,getLanguage()).accessFields(file, identifier, caseSensitive, referingClassType, fields);
- }
+ else
+ return this.mySpace.getRootClasstype(file).accessFields(file, identifier, caseSensitive, referingClassType, fields);
+
}
} catch (UnknownEntityException ignored) {
}
@@ -121,30 +123,30 @@ public Type accessMemberType(int identifier, boolean caseSensitive, int paramete
if (this.isClassType()) {
return ((ClassType) this).accessMemberClasstype(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
} else if (this.isParameterizedType()) {
- return ((ParameterizedType) this).accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
+ return this.accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
} else if (this.isParameterType()) {
return ((ParameterType) this).getBoundTypeCount() == 1
? this.getErasedType().accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file)
- : this.mySpace.getRootClasstype(file,getLanguage()).accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
+ : this.mySpace.getRootClasstype(file).accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
} else if (this.isMethodParameterType()) {
return ((MethodParameterType) this).getBoundTypeCount() == 1
? this.getErasedType().accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file)
- : this.mySpace.getRootClasstype(file,getLanguage()).accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
- } else
+ : this.mySpace.getRootClasstype(file).accessMemberType(identifier, caseSensitive, parameterTypeCount, referingClasstypeOrPackage, file);
+ } else {
throw new UnknownEntityException();
+ }
}
public Type getSuperType() throws UnknownEntityException {
if (this.isParameterizedType()) {
- return ((ParameterizedType) this).replaceType(((ParameterizedType) this)
- .getClassType().getSuperType());
- } else
+ return ((ParameterizedType) this).replaceType(((ParameterizedType) this).getClassType().getSuperType());
+ } else {
throw new UnknownEntityException();
+ }
}
public MapOfInt getAllOperators() {
- return this.isParameterizedType() ?
- ((ParameterizedType) this).getClassType().getAllOperators() : null;
+ return this.isParameterizedType() ? ((ParameterizedType) this).getClassType().getAllOperators() : null;
}
public boolean isEqualTo(Type type) {
@@ -165,9 +167,8 @@ public boolean isSubTypeOf(Type type2, Member method1, Member method2) {
&& ((MethodParameterType) this).getNumber() == ((MethodParameterType) type2).getNumber();
} else {
if (this.isArrayType() && type2.isArrayType()) {
- if (((ArrayType) this).getDimension() != ((ArrayType) type2).getDimension()) {
+ if (((ArrayType) this).getDimension() != ((ArrayType) type2).getDimension())
return false;
- }
return ((ArrayType) this).getElementType().isSubTypeOf(((ArrayType) type2).getElementType(), method1, method2);
}
@@ -177,11 +178,11 @@ public boolean isSubTypeOf(Type type2, Member method1, Member method2) {
return false;
}
- Type[] absoluteargumenttypes1 = ((ParameterizedType) this).getAbsoluteArgumentTypes();
- Type[] absoluteargumenttypes2 = ((ParameterizedType) type2).getAbsoluteArgumentTypes();
+ Type[] argumentTypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
+ Type[] types = ((ParameterizedType) type2).getAbsoluteArgumentTypes();
- for (int i = 0; i < absoluteargumenttypes1.length; ++i) {
- if (!absoluteargumenttypes1[i].isEqualTo(absoluteargumenttypes2[i], method1, method2)) {
+ for (int i = 0; i < argumentTypes.length; ++i) {
+ if (!argumentTypes[i].isEqualTo(types[i], method1, method2)) {
return false;
}
}
@@ -212,11 +213,11 @@ public boolean isEqualTo(Type type2, Member method1, Member method2) {
return false;
}
- Type[] absoluteargumenttypes1 = ((ParameterizedType) this).getAbsoluteArgumentTypes();
- Type[] absoluteargumenttypes2 = ((ParameterizedType) type2).getAbsoluteArgumentTypes();
+ Type[] argumentTypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
+ Type[] types = ((ParameterizedType) type2).getAbsoluteArgumentTypes();
- for (int i = 0; i < absoluteargumenttypes1.length; ++i) {
- if (!absoluteargumenttypes1[i].isEqualTo(absoluteargumenttypes2[i], method1, method2)) {
+ for (int i = 0; i < argumentTypes.length; ++i) {
+ if (!argumentTypes[i].isEqualTo(types[i], method1, method2)) {
return false;
}
}
@@ -231,11 +232,10 @@ public boolean isEqualTo(Type type2, Member method1, Member method2) {
public boolean isSubTypeOf(FileEntry file, Type superType) {
SetOf superTypes;
- if (this.isClassType()) {
+ if (this.isClassType())
superTypes = ((ClassType) this).getAllSuperTypes();
- } else {
+ else
superTypes = ((ParameterizedType) this).getAllSuperTypes();
- }
if (superTypes.contains(superType)) {
return true;
@@ -248,60 +248,54 @@ public boolean isSubTypeOf(FileEntry file, Type superType) {
if (t.isParameterizedType()
&& superType.isParameterizedType()
&& ((ParameterizedType) t).getClassType() == ((ParameterizedType) superType).getClassType()) {
- int[] variancesfrom = ((ParameterizedType) t).getAbsoluteArgumentVariances();
- int[] variancesto = ((ParameterizedType) superType).getAbsoluteArgumentVariances();
- Type[] argumenttypesfrom = ((ParameterizedType) t).getAbsoluteArgumentTypes();
- Type[] argumenttypesto = ((ParameterizedType) superType).getAbsoluteArgumentTypes();
-
- for (int i = 0; i < variancesto.length; ++i) {
- switch (variancesfrom[i]) {
- case 0:
- switch (variancesto[i]) {
- case 0:
- if (argumenttypesfrom[i] != argumenttypesto[i]) {
+ int[] variancesFrom = ((ParameterizedType) t).getAbsoluteArgumentVariances();
+ int[] variancesTo = ((ParameterizedType) superType).getAbsoluteArgumentVariances();
+ Type[] argumentTypesFrom = ((ParameterizedType) t).getAbsoluteArgumentTypes();
+ Type[] argumentTypesTo = ((ParameterizedType) superType).getAbsoluteArgumentTypes();
+
+ for (int i = 0; i < variancesTo.length; ++i) {
+ switch (variancesFrom[i]) {
+ case INVARIANCE:
+ switch (variancesTo[i]) {
+ case INVARIANCE:
+ if (argumentTypesFrom[i] != argumentTypesTo[i])
return false;
- }
continue;
- case 1:
- case 2:
- if (!argumenttypesfrom[i].isImplicitConvertibleTo(file, argumenttypesto[i])) {
+ case BIVARIANCE:
+ case COVARIANCE:
+ if (!argumentTypesFrom[i].isImplicitConvertibleTo(file, argumentTypesTo[i]))
return false;
- }
continue;
- case 3:
- if (!argumenttypesto[i].isImplicitConvertibleTo(file, argumenttypesfrom[i])) {
+ case CONTRAVARIANCE:
+ if (!argumentTypesTo[i].isImplicitConvertibleTo(file, argumentTypesFrom[i]))
return false;
- }
default:
continue;
}
- case 1:
- case 2:
- switch (variancesto[i]) {
- case 0:
+ case BIVARIANCE:
+ case COVARIANCE:
+ switch (variancesTo[i]) {
+ case INVARIANCE:
+ case CONTRAVARIANCE:
return false;
- case 1:
- case 2:
- if (!argumenttypesfrom[i].isImplicitConvertibleTo(file, argumenttypesto[i])) {
+ case BIVARIANCE:
+ case COVARIANCE:
+ if (!argumentTypesFrom[i].isImplicitConvertibleTo(file, argumentTypesTo[i]))
return false;
- }
continue;
- case 3:
- return false;
default:
continue;
}
- case 3:
- switch (variancesto[i]) {
- case 0:
+ case CONTRAVARIANCE:
+ switch (variancesTo[i]) {
+ case INVARIANCE:
return false;
- case 1:
- case 2:
- return argumenttypesto[i] == this.mySpace.getRootClasstype(file,getLanguage());
- case 3:
- if (!argumenttypesto[i].isImplicitConvertibleTo(file, argumenttypesfrom[i])) {
+ case BIVARIANCE:
+ case COVARIANCE:
+ return argumentTypesTo[i] == this.mySpace.getRootClasstype(file);
+ case CONTRAVARIANCE:
+ if (!argumentTypesTo[i].isImplicitConvertibleTo(file, argumentTypesFrom[i]))
return false;
- }
}
}
}
@@ -326,57 +320,55 @@ public boolean isImplicitConvertibleTo(FileEntry file, Type totype) {
public Type getCommonSuperTypeWith(FileEntry file, Type type2) throws UnknownEntityException {
if ((this.isClassType() || this.isParameterizedType()) && (type2.isClassType() || type2.isParameterizedType())) {
- Type type = this.mySpace.getRootClasstype(file,getLanguage());
- SetOf superclasstypes1 = ((ClassType) this.getErasedType()).getAllSuperClasstypes();
- SetOf superclasstypes2 = ((ClassType) type2.getErasedType()).getAllSuperClasstypes();
- superclasstypes1.DEFAULT_ITERATOR.init();
-
- while (superclasstypes1.DEFAULT_ITERATOR.hasMoreElements()) {
- ClassType t = (ClassType) superclasstypes1.DEFAULT_ITERATOR.nextKey();
- if (superclasstypes2.contains(t) && (t.getAllSuperClasstypes().contains(type) || type.isInterfaceType() && !t.isInterfaceType())) {
+ Type type = this.mySpace.getRootClasstype(file);
+ SetOf superClassTypes1 = ((ClassType) this.getErasedType()).getAllSuperClasstypes();
+ SetOf superClassTypes2 = ((ClassType) type2.getErasedType()).getAllSuperClasstypes();
+ superClassTypes1.DEFAULT_ITERATOR.init();
+
+ while (superClassTypes1.DEFAULT_ITERATOR.hasMoreElements()) {
+ ClassType t = superClassTypes1.DEFAULT_ITERATOR.nextKey();
+ if (superClassTypes2.contains(t) && (t.getAllSuperClasstypes().contains(type) || type.isInterfaceType() && !t.isInterfaceType())) {
type = t;
}
}
- SetOf supertypes1;
- if (this.isParameterizedType()) {
- supertypes1 = ((ParameterizedType) this).getAllSuperTypes();
- } else {
- supertypes1 = ((ClassType) this).getAllSuperTypes();
- }
+ SetOf superTypes1;
+ if (this.isParameterizedType())
+ superTypes1 = ((ParameterizedType) this).getAllSuperTypes();
+ else
+ superTypes1 = ((ClassType) this).getAllSuperTypes();
- SetOf supertypes2;
+ SetOf superTypes2;
if (this.isParameterizedType()) {
- supertypes2 = ((ParameterizedType) this).getAllSuperTypes();
- } else {
- supertypes2 = ((ClassType) this).getAllSuperTypes();
- }
+ superTypes2 = ((ParameterizedType) this).getAllSuperTypes();
+ } else
+ superTypes2 = ((ClassType) this).getAllSuperTypes();
- supertypes1.DEFAULT_ITERATOR.init();
+ superTypes1.DEFAULT_ITERATOR.init();
- while (supertypes1.DEFAULT_ITERATOR.hasMoreElements()) {
- Type t = (Type) supertypes1.DEFAULT_ITERATOR.nextKey();
+ while (superTypes1.DEFAULT_ITERATOR.hasMoreElements()) {
+ Type t = superTypes1.DEFAULT_ITERATOR.nextKey();
if (t.getErasedType() == type && type2.isImplicitConvertibleTo(file, t)) {
type = t;
}
}
- supertypes2.DEFAULT_ITERATOR.init();
+ superTypes2.DEFAULT_ITERATOR.init();
- while (supertypes2.DEFAULT_ITERATOR.hasMoreElements()) {
- Type t = (Type) supertypes2.DEFAULT_ITERATOR.nextKey();
+ while (superTypes2.DEFAULT_ITERATOR.hasMoreElements()) {
+ Type t = superTypes2.DEFAULT_ITERATOR.nextKey();
if (t.getErasedType() == type && this.isImplicitConvertibleTo(file, t)) {
type = t;
}
}
if (this.isParameterizedType() && type2.isParameterizedType() && type.isClassType() && ((ClassType) type).getParametertypeCount() > 0) {
- type = this.mySpace.getRootClasstype(file,getLanguage());
+ type = this.mySpace.getRootClasstype(file);
}
return type;
} else {
- return this.mySpace.getRootClasstype(file,getLanguage());
+ return this.mySpace.getRootClasstype(file);
}
}
@@ -387,12 +379,11 @@ public boolean containsType(Type partType) {
return ((ArrayType) this).getElementType().containsType(partType);
} else {
if (this.isParameterizedType()) {
- Type[] argtypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
+ Type[] argTypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
- for (Type argtype : argtypes) {
- if (argtype.containsType(partType)) {
+ for (Type argtype : argTypes) {
+ if (argtype.containsType(partType))
return true;
- }
}
}
@@ -401,18 +392,17 @@ public boolean containsType(Type partType) {
}
public boolean containsVariable() {
- if (this.isMethodParametertypeVariable()) {
+ if (this.isMethodParameterTypeVariable()) {
return true;
} else if (this.isArrayType()) {
return ((ArrayType) this).getElementType().containsVariable();
} else {
if (this.isParameterizedType()) {
- Type[] absoluteargumenttypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
+ Type[] argumentTypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
- for (Type absoluteargumenttype : absoluteargumenttypes) {
- if (absoluteargumenttype.containsVariable()) {
+ for (Type absoluteargumenttype : argumentTypes) {
+ if (absoluteargumenttype.containsVariable())
return true;
- }
}
}
@@ -423,23 +413,23 @@ public boolean containsVariable() {
public Type getNonVariableContainigType() throws UnknownEntityException {
if (!this.containsVariable()) {
return this;
- } else if (this.isMethodParametertypeVariable()) {
- MethodParameterType methodparametertype = ((MethodParametertypeVariable) this).getMethodparametertype();
+ } else if (this.isMethodParameterTypeVariable()) {
+ MethodParameterType methodparametertype = ((MethodParameterTypeVariable) this).getMethodParameterType();
return methodparametertype.getErasedType();
} else if (this.isArrayType()) {
return this.mySpace.getArraytype(((ArrayType) this).getElementType().getNonVariableContainigType(), ((ArrayType) this).getDimension());
} else if (!this.isParameterizedType()) {
return this;
} else {
- Type[] absoluteargumenttypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
- int[] absolutevariances = ((ParameterizedType) this).getAbsoluteArgumentVariances();
- Type[] replacementtypes = new Type[absoluteargumenttypes.length];
+ Type[] argumentTypes = ((ParameterizedType) this).getAbsoluteArgumentTypes();
+ int[] variances = ((ParameterizedType) this).getAbsoluteArgumentVariances();
+ Type[] replacementTypes = new Type[argumentTypes.length];
- for (int i = 0; i < absoluteargumenttypes.length; ++i) {
- replacementtypes[i] = absoluteargumenttypes[i].getNonVariableContainigType();
+ for (int i = 0; i < argumentTypes.length; ++i) {
+ replacementTypes[i] = argumentTypes[i].getNonVariableContainigType();
}
- return this.mySpace.getParameterizedtype(((ParameterizedType) this).getClassType(), replacementtypes, absolutevariances);
+ return this.mySpace.getParameterizedtype(((ParameterizedType) this).getClassType(), replacementTypes, variances);
}
}
@@ -448,9 +438,8 @@ public boolean isNonInvariantType() {
int[] variances = ((ParameterizedType) this).getAbsoluteArgumentVariances();
for (int variance : variances) {
- if (variance != 0) {
+ if (variance != INVARIANCE)
return true;
- }
}
}
@@ -458,13 +447,13 @@ public boolean isNonInvariantType() {
}
@Override
- protected void load(@NonNull StoreInputStream stream) throws IOException {
+ protected void load(StoreInputStream stream) throws IOException {
super.load(stream);
this.mySemantic = stream.readInt();
}
@Override
- protected void store(@NonNull StoreOutputStream stream) throws IOException {
+ protected void store(StoreOutputStream stream) throws IOException {
super.store(stream);
stream.writeInt(this.mySemantic);
}
@@ -502,9 +491,7 @@ public Type getErasedType() throws UnknownEntityException {
return this.getErasedType().getErasedType();
} else {
return this.isArrayType()
- ? this.mySpace.getArraytype(
- ((ArrayType) this).getElementType().getErasedType(),
- ((ArrayType) this).getDimension())
+ ? this.mySpace.getArraytype(((ArrayType) this).getElementType().getErasedType(), ((ArrayType) this).getDimension())
: this;
}
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/TypeSemantic.java b/cl/src/main/java/com/apkide/analysis/clm/api/TypeSemantic.java
similarity index 92%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/TypeSemantic.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/TypeSemantic.java
index 4d849c8..a42e72c 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/TypeSemantic.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/TypeSemantic.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public interface TypeSemantic {
int VOID_SEMANTIC = 1;
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/Variable.java b/cl/src/main/java/com/apkide/analysis/clm/api/Variable.java
new file mode 100644
index 0000000..2d1deb5
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Variable.java
@@ -0,0 +1,47 @@
+package com.apkide.analysis.clm.api;
+
+public class Variable {
+ private final FileEntry myFile;
+ private final int myLine;
+ private final int myStartColumn;
+ private final int myEndColumn;
+ private final int myIdentifier;
+ private final Type myType;
+
+ public Variable(FileEntry file, int line, int startColumn, int endColumn, int identifier, Type type) {
+ this.myFile = file;
+ this.myLine = line;
+ this.myStartColumn = startColumn;
+ this.myEndColumn = endColumn;
+ this.myIdentifier = identifier;
+ this.myType = type;
+ }
+
+ public String getHTMLString() {
+ return this.myFile.getLanguage().getRenderer() != null ? this.myFile.getLanguage().getRenderer().getHTMLString(this) : "";
+ }
+
+ public FileEntry getFile() {
+ return this.myFile;
+ }
+
+ public int getLine() {
+ return this.myLine;
+ }
+
+ public int getStartColumn() {
+ return this.myStartColumn;
+ }
+
+ public int getEndColumn() {
+ return this.myEndColumn;
+ }
+
+ public int getIdentifier() {
+ return this.myIdentifier;
+ }
+
+ public Type getType() {
+ return this.myType;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Variance.java b/cl/src/main/java/com/apkide/analysis/clm/api/Variance.java
similarity index 77%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/Variance.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/Variance.java
index 73c2d44..a2e0817 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/Variance.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/Variance.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api.clm;
+package com.apkide.analysis.clm.api;
public interface Variance {
int INVARIANCE = 0;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/APISearcherCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/APISearcherCallback.java
similarity index 50%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/APISearcherCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/APISearcherCallback.java
index 52de568..2774b1e 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/APISearcherCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/APISearcherCallback.java
@@ -1,7 +1,6 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
-
-import com.apkide.analysis.api.clm.Entity;
+import com.apkide.analysis.clm.api.Entity;
public interface APISearcherCallback {
void entityFound(Entity entity);
@@ -10,5 +9,5 @@ public interface APISearcherCallback {
void listStarted();
- void targetFound(String target);
+ void targetFound(String msg);
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/CodeCompleterCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/CodeCompleterCallback.java
similarity index 58%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/CodeCompleterCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/CodeCompleterCallback.java
index cd61334..9118209 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/CodeCompleterCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/CodeCompleterCallback.java
@@ -1,10 +1,9 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.Type;
-import com.apkide.analysis.api.clm.Variable;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.Type;
+import com.apkide.analysis.clm.api.Variable;
public interface CodeCompleterCallback {
void listElementUnknownIdentifierFound(String identifier);
@@ -27,11 +26,11 @@ public interface CodeCompleterCallback {
void listElementKeywordFound(String keyword);
- void listCompleted(FileEntry fileEntry, int line, int column, boolean var4, boolean var5);
+ void listCompleted(FileEntry file, int line, int column);
void parameterListEntityFound(Entity entity, Type type);
- void parameterListFound(FileEntry fileEntry, int line, int column, int[] lines, int[] columns);
+ void parameterListFound(FileEntry file, int line, int column, int[] lines, int[] columns);
- void parameterListNotFound(FileEntry fileEntry, int line, int column);
+ void parameterListNotFound(FileEntry file, int line, int column);
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/callback/HighlighterCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/HighlighterCallback.java
new file mode 100644
index 0000000..3bc5b5c
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/HighlighterCallback.java
@@ -0,0 +1,19 @@
+package com.apkide.analysis.clm.api.callback;
+
+import com.apkide.analysis.clm.api.FileEntry;
+
+public interface HighlighterCallback {
+ void fileStarted();
+
+ void unifedLineFound(int line);
+
+ void delegateFound(int startLine, int startColumn, int endLine, int endColumn);
+
+ void keywordFound(int startLine, int startColumn, int endLine, int endColumn);
+
+ void namespaceFound(int startLine, int startColumn, int endLine, int endColumn);
+
+ void typeFound(int startLine, int startColumn, int endLine, int endColumn);
+
+ void fileFinished(FileEntry file);
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/callback/OpenFileCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/OpenFileCallback.java
new file mode 100644
index 0000000..14f1e87
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/OpenFileCallback.java
@@ -0,0 +1,22 @@
+package com.apkide.analysis.clm.api.callback;
+
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.collections.SetOfFileEntry;
+
+import java.io.Reader;
+
+public interface OpenFileCallback {
+ Reader getOpenFileReader(FileEntry file);
+
+ long getOpenFileVersion(FileEntry file);
+
+ long getOpenFileSize(FileEntry file);
+
+ boolean areOpenFilesSynchronized();
+
+ boolean isOpenFile(FileEntry file);
+
+ SetOfFileEntry getOpenFiles();
+
+ void update();
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/RefactoringCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/RefactoringCallback.java
similarity index 52%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/RefactoringCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/RefactoringCallback.java
index 9d51ea4..714796d 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/RefactoringCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/RefactoringCallback.java
@@ -1,30 +1,29 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
-
-import com.apkide.analysis.api.clm.FileEntry;
+import com.apkide.analysis.clm.api.FileEntry;
import java.util.Hashtable;
public interface RefactoringCallback {
- void pasteText(FileEntry fileEntry, int line, int column);
+ void pasteText(FileEntry file, int line, int column);
- void clipText(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+ void clipText(FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
- void selectText(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn);
+ void selectText(FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
- void replaceText(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn, String newText);
+ void replaceText(FileEntry file, int startLine, int startColumn, int endLine, int endColumn, String newText);
- void moveText(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
+ void moveText(FileEntry file, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
- void copyText(FileEntry fileEntry, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
+ void copyText(FileEntry file, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
- void indentLines(FileEntry fileEntry, int startLine, int endLine);
+ void indentLines(FileEntry file, int startLine, int endLine);
- void renameFileOrDir(FileEntry fileEntry, String newName);
+ void renameFileOrDir(FileEntry file, String newName);
- void moveFileOrDir(FileEntry fileEntry, FileEntry newFileEntry);
+ void moveFileOrDir(FileEntry file, FileEntry newFile);
- void deleteFile(FileEntry fileEntry);
+ void deleteFile(FileEntry file);
void warningFound(String warning);
@@ -36,7 +35,7 @@ public interface RefactoringCallback {
void renameProblemFound(String problem);
- void moveTargetFound(String target, String qualifiedName);
+ void moveTargetFound(String msg, String qualifiedName);
void moveProblemFound(String problem);
@@ -74,6 +73,8 @@ public interface RefactoringCallback {
void organizeAnalysisFinished();
+ void signatureProblemFound(String problem);
+
void surroundProblemFound(String problem);
void surroundAnalysisFinished();
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/callback/StopCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/StopCallback.java
new file mode 100644
index 0000000..e634bc5
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/StopCallback.java
@@ -0,0 +1,19 @@
+package com.apkide.analysis.clm.api.callback;
+
+public interface StopCallback {
+ boolean stopSearchSymbols();
+
+ boolean stopNamespacesLoad();
+
+ boolean stopRefactoring();
+
+ boolean stopMetrics();
+
+ boolean stopUsageSearch();
+
+ boolean stopCheckInFile();
+
+ boolean stopCheck();
+
+ boolean stopAsyncSynchronize();
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StructureCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/StructureCallback.java
similarity index 77%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StructureCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/StructureCallback.java
index c42240a..d4c775e 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StructureCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/StructureCallback.java
@@ -1,8 +1,7 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.FileEntry;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.FileEntry;
public interface StructureCallback {
void fileStarted();
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/SymbolSearcherCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/SymbolSearcherCallback.java
similarity index 61%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/SymbolSearcherCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/SymbolSearcherCallback.java
index 0560c80..3fd97c9 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/SymbolSearcherCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/SymbolSearcherCallback.java
@@ -1,10 +1,9 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
-
-import com.apkide.analysis.api.clm.Entity;
+import com.apkide.analysis.clm.api.Entity;
public interface SymbolSearcherCallback {
- void listStarted(String var1);
+ void listStarted(String msg);
void listFinished();
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/UsageSearcherCallback.java b/cl/src/main/java/com/apkide/analysis/clm/api/callback/UsageSearcherCallback.java
similarity index 70%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/UsageSearcherCallback.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/callback/UsageSearcherCallback.java
index b249355..decf8c1 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/UsageSearcherCallback.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/callback/UsageSearcherCallback.java
@@ -1,9 +1,9 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.analysis.clm.api.callback;
public interface UsageSearcherCallback {
void searchStarted();
- void targetFound(String target);
+ void targetFound(String msg);
void usageFound(String filePath, int startLine, int startColumn, int endLine, int endColumn);
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntInt.java
new file mode 100644
index 0000000..1af15c8
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntInt.java
@@ -0,0 +1,346 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class FunctionOfIntInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private int[] values;
+ private int[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public FunctionOfIntInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfIntInt() {
+ this.sizeexp = 0;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfIntInt(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.put(stream.readInt(), stream.readInt());
+ }
+ }
+
+ public void put(FunctionOfIntInt set) {
+ for(int i = 0; i < set.keys.length; ++i) {
+ int key = set.keys[i];
+ if (key == Integer.MAX_VALUE) {
+ this.put(0, set.values[i]);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key, set.values[i]);
+ }
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ stream.writeInt(this.keys[i]);
+ stream.writeInt(this.values[i]);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear(int size) {
+ if (this.slots > 0) {
+ if (this.keys.length < size) {
+ Arrays.fill(this.keys, 0);
+ } else {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public boolean contains(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return -1;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ int[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private int key;
+ private int value;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ }
+
+ public boolean hasMoreElements() {
+ while(this.index < FunctionOfIntInt.this.keys.length) {
+ this.key = FunctionOfIntInt.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = FunctionOfIntInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntLong.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntLong.java
new file mode 100644
index 0000000..92fe450
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfIntLong.java
@@ -0,0 +1,347 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class FunctionOfIntLong {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private long[] values;
+ private long[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public FunctionOfIntLong(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfIntLong() {
+ this.sizeexp = 0;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfIntLong(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.put(stream.readInt(), stream.readLong());
+ }
+ }
+
+ public void put(FunctionOfIntLong set) {
+ for(int i = 0; i < set.keys.length; ++i) {
+ int key = set.keys[i];
+ if (key == Integer.MAX_VALUE) {
+ this.put(0, set.values[i]);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key, set.values[i]);
+ }
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ stream.writeInt(this.keys[i]);
+ stream.writeLong(this.values[i]);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear(int size) {
+ if (this.slots > 0) {
+ if (this.keys.length < size) {
+ Arrays.fill(this.keys, 0);
+ } else {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(int key, long value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public boolean contains(int key, long value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public long get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return -1L;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ long[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private int key;
+ private long value;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ }
+
+ public boolean hasMoreElements() {
+ while(this.index < FunctionOfIntLong.this.keys.length) {
+ this.key = FunctionOfIntLong.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = FunctionOfIntLong.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public long nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfLongInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfLongInt.java
new file mode 100644
index 0000000..68a9673
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/FunctionOfLongInt.java
@@ -0,0 +1,333 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class FunctionOfLongInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private long[] keys;
+ private long[] oldkeys;
+ private int[] values;
+ private int[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public FunctionOfLongInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfLongInt() {
+ this.sizeexp = 0;
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public FunctionOfLongInt(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.put(stream.readLong(), stream.readInt());
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ long key = this.keys[i];
+ if (key != 0L && key != Long.MIN_VALUE) {
+ stream.writeLong(this.keys[i]);
+ stream.writeInt(this.values[i]);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear(int size) {
+ if (this.slots > 0) {
+ if (this.keys.length < size) {
+ Arrays.fill(this.keys, 0L);
+ } else {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0L);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(int key1, int key2, int value) {
+ this.put((long)key1 << 32 | (long)key2, value);
+ }
+
+ public void put(long key, int value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+ int emptyIndex = -1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ } else if (curKey == Long.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public void remove(int key1, int key2) {
+ this.remove((long)key1 << 32 | (long)key2);
+ }
+
+ public void remove(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public boolean contains(int key1, int key2) {
+ return this.contains((long)key1 << 32 | (long)key2);
+ }
+
+ public boolean contains(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int get(int key1, int key2) {
+ return this.get((long)key1 << 32 | (long)key2);
+ }
+
+ public int get(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return -1;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ long[] keys;
+ int[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0L);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ long key = this.keys[i];
+ if (key != 0L && key != Long.MIN_VALUE) {
+ int index = (int)((key & Long.MAX_VALUE) % (long)keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)keys.length - 2L)) + 1;
+
+ while(keys[index] != 0L) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private long key;
+ private int value;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ }
+
+ public boolean hasMoreElements() {
+ while(this.index < FunctionOfLongInt.this.keys.length) {
+ this.key = FunctionOfLongInt.this.keys[this.index];
+ if (this.key != 0L && this.key != Long.MIN_VALUE) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = FunctionOfLongInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ }
+
+ public long nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfInt.java
new file mode 100644
index 0000000..b65add7
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfInt.java
@@ -0,0 +1,370 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.util.Arrays;
+
+public class HashtableOfInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private T[] values;
+ private T[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp = 0;
+
+ public HashtableOfInt(int size) {
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = (T[])(new Object[SIZES[this.sizeexp]]);
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public HashtableOfInt() {
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = (T[])(new Object[SIZES[this.sizeexp]]);
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ Arrays.fill(this.keys, 0);
+
+ Arrays.fill(this.values, null);
+
+ this.slots = 0;
+ this.count = 0;
+ this.oldvalues = null;
+ this.oldkeys = null;
+ }
+
+ public void put(int key, T value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public void insert(int key, T value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void remove(int key, T value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Integer.MIN_VALUE;
+ this.values[index] = null;
+ --this.count;
+ }
+
+ public boolean contains(int key, T value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int count = 0;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ this.values[index] = null;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public T get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return null;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ T[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = (T[])(new Object[SIZES[this.sizeexp]]);
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new int[SIZES[this.sizeexp]];
+ values = (T[])(new Object[SIZES[this.sizeexp]]);
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ if (this.oldvalues != null) {
+ Arrays.fill(this.oldvalues, null);
+ }
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private int key;
+ private T value;
+ private int thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.step = (key & 2147483647) % (HashtableOfInt.this.keys.length - 2) + 1;
+ this.index = (key & 2147483647) % HashtableOfInt.this.keys.length;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < HashtableOfInt.this.keys.length) {
+ this.key = HashtableOfInt.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = HashtableOfInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = HashtableOfInt.this.keys[this.index];
+ if (this.key == 0) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = HashtableOfInt.this.values[this.index];
+ this.index = (this.index + this.step) % HashtableOfInt.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % HashtableOfInt.this.keys.length;
+ }
+ }
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public T nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfLong.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfLong.java
new file mode 100644
index 0000000..e9cac9c
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/HashtableOfLong.java
@@ -0,0 +1,370 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.util.Arrays;
+
+public class HashtableOfLong {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private long[] keys;
+ private long[] oldkeys;
+ private T[] values;
+ private T[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp = 0;
+
+ public HashtableOfLong(int size) {
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = (T[])(new Object[SIZES[this.sizeexp]]);
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public HashtableOfLong() {
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = (T[])(new Object[SIZES[this.sizeexp]]);
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ Arrays.fill(this.keys, 0L);
+
+ Arrays.fill(this.values, null);
+
+ this.slots = 0;
+ this.count = 0;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ }
+
+ public void put(long key, T value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public void insert(long key, T value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == -2147483648L) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void remove(long key, T value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Long.MIN_VALUE;
+ this.values[index] = null;
+ --this.count;
+ }
+
+ public boolean contains(long key, T value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean contains(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int count = 0;
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public void remove(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Long.MIN_VALUE;
+ this.values[index] = null;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public T get(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return null;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ long[] keys;
+ T[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new long[SIZES[this.sizeexp]];
+ values = (T[])(new Object[SIZES[this.sizeexp]]);
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0L);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new long[SIZES[this.sizeexp]];
+ values = (T[])(new Object[SIZES[this.sizeexp]]);
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ long key = this.keys[i];
+ if (key != 0L && key != Long.MIN_VALUE) {
+ int index = (int)((key & Long.MAX_VALUE) % (long)keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)keys.length - 2L)) + 1;
+
+ while(keys[index] != 0L) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ if (this.oldvalues != null) {
+ Arrays.fill(this.oldvalues, null);
+ }
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private long key;
+ private T value;
+ private long thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.index = (int)((key & Long.MAX_VALUE) % (long)HashtableOfLong.this.keys.length);
+ this.step = (int)((key & Long.MAX_VALUE) % ((long)HashtableOfLong.this.keys.length - 2L)) + 1;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < HashtableOfLong.this.keys.length) {
+ this.key = HashtableOfLong.this.keys[this.index];
+ if (this.key != 0L && this.key != Long.MIN_VALUE) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = HashtableOfLong.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = HashtableOfLong.this.keys[this.index];
+ if (this.key == 0L) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = HashtableOfLong.this.values[this.index];
+ this.index = (this.index + this.step) % HashtableOfLong.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % HashtableOfLong.this.keys.length;
+ }
+ }
+ }
+
+ public long nextKey() {
+ return this.key;
+ }
+
+ public T nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/LevelScopeOf.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOf.java
similarity index 66%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/LevelScopeOf.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOf.java
index 8b58d73..cfeb2d9 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/LevelScopeOf.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOf.java
@@ -1,10 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
+package com.apkide.analysis.clm.api.collections;
-
-import static java.lang.System.arraycopy;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.util.Arrays;
@@ -25,11 +22,13 @@ public LevelScopeOf(EntitySpace space) {
}
public void declare(int identifier, E entity, int level) {
- if (this.identifierHashTable.length < this.stackPos * 3)
- rehash();
+ if (this.identifierHashTable.length < this.stackPos * 3) {
+ this.rehash();
+ }
- if (this.identifierStack.length <= this.stackPos)
- resize();
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
this.identifierStack[this.stackPos] = identifier;
this.levelStack[this.stackPos] = level;
@@ -37,11 +36,12 @@ public void declare(int identifier, E entity, int level) {
++this.stackPos;
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
while(identifierHashTable[index] != 0) {
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
+ }
}
identifierHashTable[index] = identifier;
@@ -52,25 +52,20 @@ public void declare(int identifier, E entity, int level) {
public E get(int identifier, int level) {
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
int bi = -1;
- int id = identifierHashTable[index];
- if (id == identifier && this.scopeHashTable[index] == level)
- bi = this.bindingHashTable[index];
-
-
- if (++index >= identifierHashTableLength)
- index = 0;
-
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier && this.scopeHashTable[index] == level)
+ if (id == identifier && this.scopeHashTable[index] == level) {
bi = this.bindingHashTable[index];
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
return (E)this.space.getEntity(bi);
}
@@ -78,45 +73,44 @@ public E get(int identifier, int level) {
public boolean contains(int identifier, int scope) {
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
-
- int id = identifierHashTable[index];
- if (id == identifier && this.scopeHashTable[index] == scope)
- return true;
-
- if (++index >= identifierHashTableLength)
- index = 0;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier && this.scopeHashTable[index] == scope)
+ if (id == identifier && this.scopeHashTable[index] == scope) {
return true;
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
return false;
}
public void clear() {
- if (this.stackPos > 0)
+ if (this.stackPos > 0) {
Arrays.fill(this.identifierHashTable, 0);
+ }
this.stackPos = 0;
}
public void enterBlock() {
- if (this.identifierStack.length <= this.stackPos)
- resize();
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
this.identifierStack[this.stackPos] = 0;
++this.stackPos;
}
public void enterClass() {
- if (this.identifierStack.length <= this.stackPos)
- resize();
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
this.identifierStack[this.stackPos] = 0;
++this.stackPos;
@@ -127,29 +121,25 @@ public void leaveBlock() {
int identifierHashTableLength = identifierHashTable.length;
--this.stackPos;
- for(int identifier = this.identifierStack[this.stackPos]; identifier != 0;
- identifier = this.identifierStack[this.stackPos]) {
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ for(int identifier = this.identifierStack[this.stackPos]; identifier != 0; identifier = this.identifierStack[this.stackPos]) {
+ int index = (identifier & 2147483647) % identifierHashTableLength;
int i = -1;
- int id = identifierHashTable[index];
- if (id == identifier)
- i = index;
-
- if (++index >= identifierHashTableLength)
- index = 0;
-
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier)
+ if (id == identifier) {
i = index;
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
- if (i != -1)
+ if (i != -1) {
identifierHashTable[i] = 0;
+ }
--this.stackPos;
}
@@ -157,16 +147,16 @@ public void leaveBlock() {
private void resize() {
int[] newidentifierStack = new int[this.identifierStack.length * 2 + 1];
- arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
+ System.arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
this.identifierStack = newidentifierStack;
int[] newscopeStack = new int[this.levelStack.length * 2 + 1];
- arraycopy(this.levelStack, 0, newscopeStack, 0, this.levelStack.length);
+ System.arraycopy(this.levelStack, 0, newscopeStack, 0, this.levelStack.length);
this.levelStack = newscopeStack;
int[] newbindingStack = new int[this.bindingStack.length * 2 + 1];
- arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
+ System.arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
this.bindingStack = newbindingStack;
int[] newslotStack = new int[this.slotStack.length * 2 + 1];
- arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
+ System.arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
this.slotStack = newslotStack;
}
@@ -180,11 +170,12 @@ private void rehash() {
if (identifier != 0) {
int scope = this.levelStack[i];
int binding = this.bindingStack[i];
- int index = (identifier & Integer.MAX_VALUE) % newidentifierHashTable.length;
+ int index = (identifier & 2147483647) % newidentifierHashTable.length;
while(newidentifierHashTable[index] != 0) {
- if (++index >= newidentifierHashTable.length)
+ if (++index >= newidentifierHashTable.length) {
index = 0;
+ }
}
newidentifierHashTable[index] = identifier;
@@ -213,20 +204,19 @@ public void init(int level) {
}
public boolean hasMoreElements() {
- if (this.pos < 0) {
- return false;
- } else {
- while(this.pos >= 0) {
+ if (this.pos >= 0) {
+ while (this.pos >= 0) {
this.key = LevelScopeOf.this.identifierStack[this.pos];
this.value = LevelScopeOf.this.bindingStack[this.pos];
int l = LevelScopeOf.this.levelStack[this.pos];
--this.pos;
- if (this.key != 0 && this.level == l)
+ if (this.key != 0 && this.level == l) {
return true;
+ }
}
- return false;
}
+ return false;
}
public int nextKey() {
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOfInt.java
new file mode 100644
index 0000000..846aa83
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/LevelScopeOfInt.java
@@ -0,0 +1,185 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.util.Arrays;
+
+public class LevelScopeOfInt {
+ private int[] identifierHashTable = new int[3000];
+ private int[] bindingHashTable = new int[3000];
+ private int[] scopeHashTable = new int[3000];
+ private int[] identifierStack = new int[1000];
+ private int[] levelStack = new int[1000];
+ private int[] bindingStack = new int[1000];
+ private int[] slotStack = new int[1000];
+ private int stackPos = 0;
+
+ public LevelScopeOfInt() {
+ }
+
+ public void declare(int identifier, int binding, int level) {
+ if (this.identifierHashTable.length < this.stackPos * 3) {
+ this.rehash();
+ }
+
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
+
+ this.identifierStack[this.stackPos] = identifier;
+ this.levelStack[this.stackPos] = level;
+ this.bindingStack[this.stackPos] = binding;
+ ++this.stackPos;
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+
+ while(identifierHashTable[index] != 0) {
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ }
+
+ identifierHashTable[index] = identifier;
+ this.bindingHashTable[index] = binding;
+ this.scopeHashTable[index] = level;
+ }
+
+ public int get(int identifier, int level) {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+ int bi = -1;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier && this.scopeHashTable[index] == level) {
+ bi = this.bindingHashTable[index];
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ return bi;
+ }
+
+ public boolean contains(int identifier, int scope) {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier && this.scopeHashTable[index] == scope) {
+ return true;
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ return false;
+ }
+
+ public void clear() {
+ if (this.stackPos > 0) {
+ Arrays.fill(this.identifierHashTable, 0);
+ }
+
+ this.stackPos = 0;
+ }
+
+ public void enterBlock() {
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
+
+ this.identifierStack[this.stackPos] = 0;
+ ++this.stackPos;
+ }
+
+ public void enterClass() {
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
+
+ this.identifierStack[this.stackPos] = 0;
+ ++this.stackPos;
+ }
+
+ public void leaveBlock() {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ --this.stackPos;
+
+ for(int identifier = this.identifierStack[this.stackPos]; identifier != 0; identifier = this.identifierStack[this.stackPos]) {
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+ int i = -1;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier) {
+ i = index;
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ if (i != -1) {
+ identifierHashTable[i] = 0;
+ }
+
+ --this.stackPos;
+ }
+ }
+
+ private void resize() {
+ int[] newidentifierStack = new int[this.identifierStack.length * 2 + 1];
+ System.arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
+ this.identifierStack = newidentifierStack;
+ int[] newscopeStack = new int[this.levelStack.length * 2 + 1];
+ System.arraycopy(this.levelStack, 0, newscopeStack, 0, this.levelStack.length);
+ this.levelStack = newscopeStack;
+ int[] newbindingStack = new int[this.bindingStack.length * 2 + 1];
+ System.arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
+ this.bindingStack = newbindingStack;
+ int[] newslotStack = new int[this.slotStack.length * 2 + 1];
+ System.arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
+ this.slotStack = newslotStack;
+ }
+
+ private void rehash() {
+ int[] newidentifierHashTable = new int[this.identifierHashTable.length * 2 + 1];
+ int[] newbindingHashTable = new int[this.identifierHashTable.length * 2 + 1];
+ int[] newscopeHashTable = new int[this.identifierHashTable.length * 2 + 1];
+
+ for(int i = 0; i < this.stackPos; ++i) {
+ int identifier = this.identifierStack[i];
+ if (identifier != 0) {
+ int scope = this.levelStack[i];
+ int binding = this.bindingStack[i];
+ int index = (identifier & 2147483647) % newidentifierHashTable.length;
+
+ while(newidentifierHashTable[index] != 0) {
+ if (++index >= newidentifierHashTable.length) {
+ index = 0;
+ }
+ }
+
+ newidentifierHashTable[index] = identifier;
+ newbindingHashTable[index] = binding;
+ newscopeHashTable[index] = scope;
+ }
+ }
+
+ this.identifierHashTable = newidentifierHashTable;
+ this.scopeHashTable = newscopeHashTable;
+ this.bindingHashTable = newbindingHashTable;
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ListOf.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOf.java
similarity index 69%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ListOf.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOf.java
index b9a535a..7e765d6 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ListOf.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOf.java
@@ -1,14 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
-
-import static java.lang.System.arraycopy;
-
-import androidx.annotation.NonNull;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
+package com.apkide.analysis.clm.api.collections;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.io.IOException;
import java.util.Comparator;
@@ -17,19 +10,19 @@ public class ListOf {
private int size;
private final EntitySpace space;
- public ListOf(@NonNull EntitySpace space) {
+ public ListOf(EntitySpace space) {
this.space = space;
this.values = null;
this.size = 0;
}
- public ListOf(@NonNull EntitySpace space, int size) {
+ public ListOf(EntitySpace space, int size) {
this.space = space;
this.values = new int[size];
this.size = size;
}
- public ListOf(@NonNull EntitySpace space,@NonNull StoreInputStream stream) throws IOException {
+ public ListOf(EntitySpace space, StoreInputStream stream) throws IOException {
this.space = space;
this.size = stream.readInt();
if (this.size > 0) {
@@ -43,14 +36,15 @@ public ListOf(@NonNull EntitySpace space,@NonNull StoreInputStream stream) throw
public boolean contains(Entity entity) {
for(int i = 0; i < this.size(); ++i) {
- if (get(i) == entity)
+ if (this.get(i) == entity) {
return true;
+ }
}
return false;
}
- public void store(@NonNull StoreOutputStream stream) throws IOException {
+ public void store(StoreOutputStream stream) throws IOException {
if (this.values == null) {
stream.writeInt(0);
} else {
@@ -67,14 +61,16 @@ public void clear() {
}
public void push(E entity) {
- add(entity);
+ this.add(entity);
}
public E pop() {
- if (this.size == 0)
+ if (this.size == 0) {
return null;
- else
- return (E)this.space.getEntity(this.values[--this.size]);
+ } else {
+ int value = this.values[--this.size];
+ return (E)this.space.getEntity(value);
+ }
}
public E peek() {
@@ -82,11 +78,11 @@ public E peek() {
}
public void add(E entity) {
- if (this.values == null)
+ if (this.values == null) {
this.values = new int[10];
- else if (this.size >= this.values.length) {
+ } else if (this.size >= this.values.length) {
int[] values = new int[this.values.length * 2 + 1];
- arraycopy(this.values, 0, values, 0, this.values.length);
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
this.values = values;
}
@@ -94,14 +90,16 @@ else if (this.size >= this.values.length) {
}
public E get(int index) {
- if (this.values == null)
+ if (this.values == null) {
return null;
- else if (index >= this.values.length)
+ } else if (index >= this.values.length) {
return null;
- else if (index >= this.size)
+ } else if (index >= this.size) {
return null;
- else
- return (E)this.space.getEntity(this.values[index]);
+ } else {
+ int value = this.values[index];
+ return (E)this.space.getEntity(value);
+ }
}
public void setSize(int size) {
@@ -109,16 +107,17 @@ public void setSize(int size) {
}
public void set(int index, E entity) {
- if (this.values == null)
+ if (this.values == null) {
this.values = new int[Math.max(10, index + 1)];
- else if (index >= this.values.length) {
+ } else if (index >= this.values.length) {
int[] values = new int[Math.max(index + 1, this.values.length * 2 + 1)];
- arraycopy(this.values, 0, values, 0, this.values.length);
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
this.values = values;
}
- if (index >= this.size)
+ if (index >= this.size) {
this.size = index + 1;
+ }
this.values[index] = this.space.getID(entity);
}
@@ -126,7 +125,7 @@ else if (index >= this.values.length) {
public void remove(int index) {
if (this.values != null) {
if (index < this.size) {
- arraycopy(this.values, index + 1, this.values, index, this.size - index - 1);
+ System.arraycopy(this.values, index + 1, this.values, index, this.size - index - 1);
--this.size;
}
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfByte.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfByte.java
new file mode 100644
index 0000000..c3b68ca
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfByte.java
@@ -0,0 +1,171 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+
+public class ListOfByte {
+ private byte[] values;
+ private int size;
+
+ public ListOfByte() {
+ this.values = null;
+ this.size = 0;
+ }
+
+ public ListOfByte(int size) {
+ this.values = new byte[size];
+ this.size = size;
+ }
+
+ public ListOfByte(StoreInputStream stream) throws IOException {
+ this.size = stream.readInt();
+ if (this.size > 0) {
+ this.values = new byte[this.size];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readByte();
+ }
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ if (this.values == null) {
+ stream.writeInt(0);
+ } else {
+ stream.writeInt(this.size);
+
+ for(int i = 0; i < this.size; ++i) {
+ stream.writeInt(this.values[i]);
+ }
+ }
+ }
+
+ public void clear() {
+ this.size = 0;
+ }
+
+ public void push(byte value) {
+ this.add(value);
+ }
+
+ public int[] toIntArray() {
+ int[] a = new int[this.size()];
+ if (this.size() > 0) {
+ System.arraycopy(this.values, 0, a, 0, this.size());
+ }
+
+ return a;
+ }
+
+ public void add(byte value) {
+ if (this.values == null) {
+ this.values = new byte[10];
+ } else if (this.size >= this.values.length) {
+ byte[] values = new byte[this.values.length * 2 + 1];
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
+ this.values = values;
+ }
+
+ this.values[this.size++] = value;
+ }
+
+ public byte pop() {
+ return this.size == 0 ? -1 : this.values[--this.size];
+ }
+
+ public byte peek() {
+ return this.size == 0 ? -1 : this.get(this.size - 1);
+ }
+
+ public byte get(int index) {
+ if (this.values == null) {
+ return -1;
+ } else if (index >= this.values.length) {
+ return -1;
+ } else {
+ return index >= this.size ? -1 : this.values[index];
+ }
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ public void set(int index, byte value) {
+ if (this.values == null) {
+ this.values = new byte[Math.max(10, index + 1)];
+ } else if (index >= this.values.length) {
+ byte[] values = new byte[Math.max(index + 1, this.values.length * 2 + 1)];
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
+ this.values = values;
+ }
+
+ if (index >= this.size) {
+ this.size = index + 1;
+ }
+
+ this.values[index] = value;
+ }
+
+ public void remove(int index) {
+ if (this.values != null) {
+ if (index < this.size) {
+ System.arraycopy(this.values, index + 1, this.values, index, this.size - index - 1);
+ --this.size;
+ }
+ }
+ }
+
+ public int size() {
+ return this.size;
+ }
+
+ public int firstindexof(int value) {
+ return this.firstindexof(value, 0);
+ }
+
+ public int firstindexof(int value, int fromIndex) {
+ if (this.values != null) {
+ for (int i = fromIndex; i < this.size; ++i) {
+ if (this.values[i] == value) {
+ return i;
+ }
+ }
+
+ }
+ return -1;
+ }
+
+ public void sort() {
+ this.sort(0, this.size - 1);
+ }
+
+ private void sort(int i, int j) {
+ if (i < j) {
+ int oldi = i;
+ int oldj = j;
+ int z = i + (j - i) / 2;
+ byte pivot = this.values[z];
+
+ while(i <= j) {
+ while(this.values[i] < pivot) {
+ ++i;
+ }
+
+ while(pivot < this.values[j]) {
+ --j;
+ }
+
+ if (i <= j) {
+ byte temp = this.values[j];
+ this.values[j] = this.values[i];
+ this.values[i] = temp;
+ ++i;
+ --j;
+ }
+ }
+
+ this.sort(oldi, j);
+ this.sort(i, oldj);
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfInt.java
new file mode 100644
index 0000000..a58d2eb
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ListOfInt.java
@@ -0,0 +1,206 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Comparator;
+
+public class ListOfInt {
+ private int[] values;
+ private int size;
+
+ public ListOfInt() {
+ this.values = null;
+ this.size = 0;
+ }
+
+ public ListOfInt(int size) {
+ this.values = new int[size];
+ this.size = size;
+ }
+
+ public ListOfInt(StoreInputStream stream) throws IOException {
+ this.size = stream.readInt();
+ if (this.size > 0) {
+ this.values = new int[this.size];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readInt();
+ }
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ if (this.values == null) {
+ stream.writeInt(0);
+ } else {
+ stream.writeInt(this.size);
+
+ for(int i = 0; i < this.size; ++i) {
+ stream.writeInt(this.values[i]);
+ }
+ }
+ }
+
+ public void clear() {
+ this.size = 0;
+ }
+
+ public void push(int value) {
+ this.add(value);
+ }
+
+ public int[] toIntArray() {
+ int[] a = new int[this.size()];
+ if (this.size() > 0) {
+ System.arraycopy(this.values, 0, a, 0, this.size());
+ }
+
+ return a;
+ }
+
+ public void add(int value) {
+ if (this.values == null) {
+ this.values = new int[10];
+ } else if (this.size >= this.values.length) {
+ int[] values = new int[this.values.length * 2 + 1];
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
+ this.values = values;
+ }
+
+ this.values[this.size++] = value;
+ }
+
+ public int pop() {
+ return this.size == 0 ? -1 : this.values[--this.size];
+ }
+
+ public int peek() {
+ return this.size == 0 ? -1 : this.get(this.size - 1);
+ }
+
+ public int get(int index) {
+ if (this.values == null) {
+ return -1;
+ } else if (index >= this.values.length) {
+ return -1;
+ } else {
+ return index >= this.size ? -1 : this.values[index];
+ }
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ public void set(int index, int value) {
+ if (this.values == null) {
+ this.values = new int[Math.max(10, index + 1)];
+ } else if (index >= this.values.length) {
+ int[] values = new int[Math.max(index + 1, this.values.length * 2 + 1)];
+ System.arraycopy(this.values, 0, values, 0, this.values.length);
+ this.values = values;
+ }
+
+ if (index >= this.size) {
+ this.size = index + 1;
+ }
+
+ this.values[index] = value;
+ }
+
+ public void remove(int index) {
+ if (this.values != null) {
+ if (index < this.size) {
+ System.arraycopy(this.values, index + 1, this.values, index, this.size - index - 1);
+ --this.size;
+ }
+ }
+ }
+
+ public int size() {
+ return this.size;
+ }
+
+ public int firstindexof(int value) {
+ return this.firstindexof(value, 0);
+ }
+
+ public int firstindexof(int value, int fromIndex) {
+ if (this.values != null) {
+ for (int i = fromIndex; i < this.size; ++i) {
+ if (this.values[i] == value) {
+ return i;
+ }
+ }
+
+ }
+ return -1;
+ }
+
+ public void sort() {
+ this.sort(0, this.size - 1);
+ }
+
+ private void sort(int i, int j) {
+ if (i < j) {
+ int oldi = i;
+ int oldj = j;
+ int z = i + (j - i) / 2;
+ int pivot = this.values[z];
+
+ while(i <= j) {
+ while(this.values[i] < pivot) {
+ ++i;
+ }
+
+ while(pivot < this.values[j]) {
+ --j;
+ }
+
+ if (i <= j) {
+ int temp = this.values[j];
+ this.values[j] = this.values[i];
+ this.values[i] = temp;
+ ++i;
+ --j;
+ }
+ }
+
+ this.sort(oldi, j);
+ this.sort(i, oldj);
+ }
+ }
+
+ public void sort(Comparator comp) {
+ this.sort(0, this.size - 1, comp);
+ }
+
+ private void sort(int i, int j, Comparator comp) {
+ if (i < j) {
+ int oldi = i;
+ int oldj = j;
+ int z = i + (j - i) / 2;
+ int pivot = this.values[z];
+
+ while(i <= j) {
+ while(comp.compare(this.values[i], pivot) < 0) {
+ ++i;
+ }
+
+ while(comp.compare(pivot, this.values[j]) < 0) {
+ --j;
+ }
+
+ if (i <= j) {
+ int temp = this.values[j];
+ this.values[j] = this.values[i];
+ this.values[i] = temp;
+ ++i;
+ --j;
+ }
+ }
+
+ this.sort(oldi, j, comp);
+ this.sort(i, oldj, comp);
+ }
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOf.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOf.java
similarity index 73%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOf.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOf.java
index a1904aa..7052af9 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOf.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOf.java
@@ -1,9 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
+package com.apkide.analysis.clm.api.collections;
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.io.IOException;
import java.util.Arrays;
@@ -85,7 +83,7 @@ public MapOf(EntitySpace space, StoreInputStream stream) throws IOException {
this.count = 0;
for(int i = 0; i < count; ++i) {
- insert(stream.readInt(), stream.readInt());
+ this.insert(stream.readInt(), stream.readInt());
}
}
@@ -119,111 +117,121 @@ public void insert(MapOf extends K, ? extends V> map) {
for(int i = 0; i < map.keys.length; ++i) {
int key = map.keys[i];
int value = map.values[i];
- if (key == Integer.MAX_VALUE)
- insert(0, value);
- else if (key != 0 && key != Integer.MIN_VALUE)
- insert(key, value);
+ if (key == Integer.MAX_VALUE) {
+ this.insert(0, value);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.insert(key, value);
+ }
}
}
public void put(K k, V v) {
- put(this.space.getID(k), this.space.getID(v));
+ this.put(this.space.getID(k), this.space.getID(v));
}
private void put(int key, int value) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
boolean inserted = false;
int emptyIndex = -1;
for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
if (curKey == key) {
- if (this.values[index] == value)
+ if (this.values[index] == value) {
inserted = true;
- else {
+ } else {
this.keys[index] = Integer.MIN_VALUE;
--this.count;
}
- } else if (curKey == Integer.MIN_VALUE)
+ } else if (curKey == Integer.MIN_VALUE) {
emptyIndex = index;
+ }
index = (index + step) % this.keys.length;
}
if (!inserted) {
- if (emptyIndex != -1)
+ if (emptyIndex != -1) {
index = emptyIndex;
+ }
this.keys[index] = key;
this.values[index] = value;
++this.count;
- if (emptyIndex == -1)
+ if (emptyIndex == -1) {
++this.slots;
+ }
- if (this.slots * LOAD_FACTOR > this.keys.length)
+ if (this.slots * 2 > this.keys.length) {
this.rehash();
+ }
}
}
public void insert(K k, V v) {
- insert(this.space.getID(k), this.space.getID(v));
+ this.insert(this.space.getID(k), this.space.getID(v));
}
private void insert(int key, int value) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
boolean inserted = false;
int emptyIndex = -1;
for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
if (curKey == key) {
- if (this.values[index] == value)
+ if (this.values[index] == value) {
return;
-
- } else if (curKey == Integer.MIN_VALUE)
+ }
+ } else if (curKey == Integer.MIN_VALUE) {
emptyIndex = index;
-
+ }
index = (index + step) % this.keys.length;
}
if (!inserted) {
- if (emptyIndex != -1)
+ if (emptyIndex != -1) {
index = emptyIndex;
+ }
this.keys[index] = key;
this.values[index] = value;
++this.count;
- if (emptyIndex == -1)
+ if (emptyIndex == -1) {
++this.slots;
+ }
- if (this.slots * LOAD_FACTOR > this.keys.length)
- rehash();
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
}
}
public boolean contains(K key, V value) {
- return contains(this.space.getID(key), this.space.getID(value));
+ return this.contains(this.space.getID(key), this.space.getID(value));
}
private boolean contains(int key, int value) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
-
- for(int curKey = this.keys[index]; curKey != key || this.values[index] != value;
- curKey = this.keys[index]) {
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
- if (curKey == 0)
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
return false;
+ }
index = (index + step) % this.keys.length;
}
@@ -232,15 +240,16 @@ private boolean contains(int key, int value) {
}
public void remove(K key, V value) {
- remove(this.space.getID(key), this.space.getID(value));
+ this.remove(this.space.getID(key), this.space.getID(value));
}
private void remove(int key, int value) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
if (curKey == key && this.values[index] == value) {
@@ -253,15 +262,16 @@ private void remove(int key, int value) {
}
public void remove(K key) {
- remove(this.space.getID(key));
+ this.remove(this.space.getID(key));
}
private void remove(int key) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
if (curKey == key) {
@@ -274,19 +284,21 @@ private void remove(int key) {
}
public boolean contains(K key) {
- return contains(this.space.getID(key));
+ return this.contains(this.space.getID(key));
}
private boolean contains(int key) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return false;
+ }
index = (index + step) % this.keys.length;
}
@@ -295,20 +307,22 @@ private boolean contains(int key) {
}
public int count(K key) {
- return count(this.space.getID(key));
+ return this.count(this.space.getID(key));
}
private int count(int key) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
int count = 0;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
- if (curKey == key)
+ if (curKey == key) {
++count;
+ }
index = (index + step) % this.keys.length;
}
@@ -323,8 +337,9 @@ public K get() {
int key = this.keys[index];
++index;
if (key != 0 && key != Integer.MIN_VALUE) {
- if (key == Integer.MAX_VALUE)
+ if (key == Integer.MAX_VALUE) {
key = 0;
+ }
return (K)this.space.getEntity(key);
}
@@ -338,15 +353,17 @@ public V get(K key) {
}
private int get(int key) {
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return -1;
+ }
index = (index + step) % this.keys.length;
}
@@ -357,7 +374,7 @@ private int get(int key) {
private void rehash() {
int[] keys;
int[] values;
- if (this.count * LOAD_FACTOR > this.keys.length) {
+ if (this.count * 2 > this.keys.length) {
++this.sizeexp;
this.oldkeys = null;
this.oldvalues = null;
@@ -383,8 +400,8 @@ private void rehash() {
for(int i = 0; i < this.keys.length; ++i) {
int key = this.keys[i];
if (key != 0 && key != Integer.MIN_VALUE) {
- int step = (key & Integer.MAX_VALUE) % (keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % keys.length;
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
while(keys[index] != 0) {
index = (index + step) % keys.length;
@@ -422,12 +439,13 @@ public void init() {
public void init(K k) {
int key = MapOf.this.space.getID(k);
- if (key == 0)
+ if (key == 0) {
key = Integer.MAX_VALUE;
+ }
this.thekey = key;
- this.step = (key & Integer.MAX_VALUE) % (MapOf.this.keys.length - 2) + 1;
- this.index = (key & Integer.MAX_VALUE) % MapOf.this.keys.length;
+ this.step = (key & 2147483647) % (MapOf.this.keys.length - 2) + 1;
+ this.index = (key & 2147483647) % MapOf.this.keys.length;
}
public boolean hasMoreElements() {
@@ -435,8 +453,9 @@ public boolean hasMoreElements() {
while(this.index < MapOf.this.keys.length) {
this.key = MapOf.this.keys[this.index];
if (this.key != 0 && this.key != Integer.MIN_VALUE) {
- if (this.key == Integer.MAX_VALUE)
+ if (this.key == Integer.MAX_VALUE) {
this.key = 0;
+ }
this.value = MapOf.this.values[this.index];
++this.index;
@@ -450,12 +469,14 @@ public boolean hasMoreElements() {
} else {
while(true) {
this.key = MapOf.this.keys[this.index];
- if (this.key == 0)
+ if (this.key == 0) {
return false;
+ }
if (this.key == this.thekey) {
- if (this.key == Integer.MAX_VALUE)
+ if (this.key == Integer.MAX_VALUE) {
this.key = 0;
+ }
this.value = MapOf.this.values[this.index];
this.index = (this.index + this.step) % MapOf.this.keys.length;
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfInt.java
similarity index 93%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOfInt.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfInt.java
index 07e61b8..606b87e 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/MapOfInt.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfInt.java
@@ -1,12 +1,9 @@
-package com.apkide.analysis.api.clm.collections;
-
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
+package com.apkide.analysis.clm.api.collections;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.io.IOException;
+import java.util.Arrays;
public class MapOfInt {
public final Iterator DEFAULT_ITERATOR = new Iterator();
@@ -122,9 +119,7 @@ public Iterator createIterator() {
public void clear() {
if (this.slots > 0) {
- for(int i = 0; i < this.keys.length; ++i) {
- this.keys[i] = 0;
- }
+ Arrays.fill(this.keys, 0);
this.slots = 0;
this.count = 0;
@@ -361,9 +356,7 @@ private void rehash() {
} else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
keys = this.oldkeys;
- for(int i = 0; i < keys.length; ++i) {
- keys[i] = 0;
- }
+ Arrays.fill(keys, 0);
values = this.oldvalues;
this.oldkeys = this.keys;
@@ -401,26 +394,6 @@ private void rehash() {
public int size() {
return this.count;
}
-
- @Override
- public String toString() {
- String result = "{";
-
- for(int i = 0; i < this.keys.length; ++i) {
- int key = this.keys[i];
- if (key != 0 && key != Integer.MIN_VALUE) {
- int value = this.values[i];
- if (key == Integer.MAX_VALUE) {
- result = result + "0->" + value + ", ";
- } else {
- result = result + key + "->" + value + ", ";
- }
- }
- }
-
- return result + "}";
- }
-
public class Iterator {
private int index = 0;
private int step = 0;
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntArrayInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntArrayInt.java
new file mode 100644
index 0000000..a424bc3
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntArrayInt.java
@@ -0,0 +1,346 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class MapOfIntArrayInt {
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] arrays;
+ private int arraypos;
+ private int[] poss;
+ private int[] values;
+ private int slots;
+ private int count;
+ private int sizeexp;
+ private int[] buffer;
+
+ public MapOfIntArrayInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.poss = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.arrays = new int[10];
+ this.arraypos = 1;
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntArrayInt() {
+ this.sizeexp = 0;
+ this.poss = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.arrays = new int[10];
+ this.arraypos = 1;
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntArrayInt(StoreInputStream stream) throws IOException {
+ this.count = stream.readInt();
+ this.slots = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.poss = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.poss.length; ++i) {
+ this.poss[i] = stream.readInt();
+ }
+
+ this.values = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readInt();
+ }
+
+ this.arraypos = stream.readInt();
+ this.arrays = new int[stream.readInt()];
+
+ for(int i = 0; i < this.arraypos; ++i) {
+ this.arrays[i] = stream.readInt();
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.slots);
+ stream.writeInt(this.sizeexp);
+
+ for (int j : this.poss) {
+ stream.writeInt(j);
+ }
+
+ for (int value : this.values) {
+ stream.writeInt(value);
+ }
+
+ stream.writeInt(this.arraypos);
+ stream.writeInt(this.arrays.length);
+
+ for(int i = 0; i < this.arraypos; ++i) {
+ stream.writeInt(this.arrays[i]);
+ }
+ }
+
+ public void clear() {
+ Arrays.fill(this.poss, 0);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ private int getHash(int[] array, int off, int len) {
+ int key = 0;
+
+ for(int i = 0; i < len; ++i) {
+ key ^= array[i + off];
+ }
+
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ return key & 2147483647;
+ }
+
+ public void put(int array0, int[] array1, int[] array2, int off, int len, int value) {
+ int bufferlen = 1 + 2 * len;
+ if (this.buffer == null || this.buffer.length <= bufferlen) {
+ this.buffer = new int[bufferlen];
+ }
+
+ this.buffer[0] = array0;
+ System.arraycopy(array1, off, this.buffer, 1, len);
+ System.arraycopy(array2, off, this.buffer, 1 + len, len);
+ this.put(this.buffer, 0, bufferlen, value);
+ }
+
+ public int get(int array0, int[] array1, int[] array2, int off, int len) {
+ int bufferlen = 1 + 2 * len;
+ if (this.buffer == null || this.buffer.length <= bufferlen) {
+ this.buffer = new int[bufferlen];
+ }
+
+ this.buffer[0] = array0;
+ System.arraycopy(array1, off, this.buffer, 1, len);
+ System.arraycopy(array2, off, this.buffer, 1 + len, len);
+ return this.get(this.buffer, 0, bufferlen);
+ }
+
+ public boolean contains(int array0, int[] array1, int[] array2, int off, int len) {
+ int bufferlen = 1 + 2 * len;
+ if (this.buffer == null || this.buffer.length <= bufferlen) {
+ this.buffer = new int[bufferlen];
+ }
+
+ this.buffer[0] = array0;
+ System.arraycopy(array1, off, this.buffer, 1, len);
+ System.arraycopy(array2, off, this.buffer, 1 + len, len);
+ return this.contains(this.buffer, 0, bufferlen);
+ }
+
+ public void put(int[] array, int off, int len, int value) {
+ int hash = this.getHash(array, off, len);
+ int index = hash % this.poss.length;
+ int step = hash % (this.poss.length - 2) + 1;
+
+ int curPos;
+ for(curPos = this.poss[index]; curPos != 0 && curPos != Integer.MIN_VALUE; curPos = this.poss[index]) {
+ if (this.arrays[curPos] == len) {
+ ++curPos;
+ int i = 0;
+
+ while(true) {
+ if (i >= len) {
+ this.values[index] = value;
+ return;
+ }
+
+ if (this.arrays[curPos++] != array[off + i]) {
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ index = (index + step) % this.poss.length;
+ }
+
+ this.poss[index] = this.arraypos;
+ if (this.arraypos + len + 1 >= this.arrays.length) {
+ int[] arrays = new int[Math.max(this.arrays.length + len + 1, this.arrays.length * 2 + 1)];
+ System.arraycopy(this.arrays, 0, arrays, 0, this.arrays.length);
+ this.arrays = arrays;
+ }
+
+ this.arrays[this.arraypos++] = len;
+
+ for(int i = 0; i < len; ++i) {
+ this.arrays[this.arraypos++] = array[off + i];
+ }
+
+ this.values[index] = value;
+ if (curPos != Integer.MIN_VALUE) {
+ ++this.slots;
+ }
+
+ ++this.count;
+ if (this.slots * 2 > this.poss.length) {
+ this.rehash();
+ }
+ }
+
+ public boolean contains(int[] array, int off, int len) {
+ int hash = this.getHash(array, off, len);
+ int index = hash % this.poss.length;
+ int step = hash % (this.poss.length - 2) + 1;
+
+ for(int curPos = this.poss[index]; curPos != 0 && curPos != Integer.MIN_VALUE; curPos = this.poss[index]) {
+ if (this.arrays[curPos] == len) {
+ ++curPos;
+ int i = 0;
+
+ while(true) {
+ if (i >= len) {
+ return true;
+ }
+
+ if (this.arrays[curPos++] != array[off + i]) {
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ index = (index + step) % this.poss.length;
+ }
+
+ return false;
+ }
+
+ public int get(int[] array, int off, int len) {
+ int hash = this.getHash(array, off, len);
+ int index = hash % this.poss.length;
+ int step = hash % (this.poss.length - 2) + 1;
+
+ for(int curPos = this.poss[index]; curPos != 0 && curPos != Integer.MIN_VALUE; curPos = this.poss[index]) {
+ if (this.arrays[curPos] == len) {
+ ++curPos;
+ int i = 0;
+
+ while(true) {
+ if (i >= len) {
+ return this.values[index];
+ }
+
+ if (this.arrays[curPos++] != array[off + i]) {
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ index = (index + step) % this.poss.length;
+ }
+
+ return -1;
+ }
+
+ public void remove(int[] array, int off, int len) {
+ int hash = this.getHash(array, off, len);
+ int index = hash % this.poss.length;
+ int step = hash % (this.poss.length - 2) + 1;
+
+ for(int curPos = this.poss[index]; curPos != 0 && curPos != Integer.MIN_VALUE; curPos = this.poss[index]) {
+ if (this.arrays[curPos] == len) {
+ ++curPos;
+ int i = 0;
+
+ while(true) {
+ if (i >= len) {
+ this.poss[index] = Integer.MIN_VALUE;
+ break;
+ }
+
+ if (this.arrays[curPos++] != array[off + i]) {
+ break;
+ }
+
+ ++i;
+ }
+ }
+
+ index = (index + step) % this.poss.length;
+ }
+ }
+
+ private void rehash() {
+ ++this.sizeexp;
+ int[] poss = new int[SIZES[this.sizeexp]];
+ int[] values = new int[SIZES[this.sizeexp]];
+ int slots = 0;
+
+ for(int i = 0; i < this.poss.length; ++i) {
+ int pos = this.poss[i];
+ if (pos != 0 && pos != Integer.MIN_VALUE) {
+ int hash = this.getHash(this.arrays, pos + 1, this.arrays[pos]);
+ int index = hash % poss.length;
+ int step = hash % (poss.length - 2) + 1;
+
+ while(poss[index] != 0) {
+ index = (index + step) % poss.length;
+ }
+
+ poss[index] = pos;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.poss = poss;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntInt.java
new file mode 100644
index 0000000..5c63f59
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntInt.java
@@ -0,0 +1,461 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class MapOfIntInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private int[] values;
+ private int[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public MapOfIntInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntInt() {
+ this.sizeexp = 0;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntInt(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.insert(stream.readInt(), stream.readInt());
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ stream.writeInt(this.keys[i]);
+ stream.writeInt(this.values[i]);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear(int size) {
+ if (this.slots > 0) {
+ if (this.keys.length < size) {
+ Arrays.fill(this.keys, 0);
+ } else {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void insert(MapOfIntInt map) {
+ for(int i = 0; i < map.keys.length; ++i) {
+ int key = map.keys[i];
+ int value = map.values[i];
+ if (key == Integer.MAX_VALUE) {
+ this.insert(0, value);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.insert(key, value);
+ }
+ }
+ }
+
+ public void put(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ inserted = true;
+ } else {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void insert(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public boolean contains(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public void remove(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key && this.values[index] == value) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int count = 0;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public int get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return -1;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ int[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private int key;
+ private int value;
+ private int thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.step = (key & 2147483647) % (MapOfIntInt.this.keys.length - 2) + 1;
+ this.index = (key & 2147483647) % MapOfIntInt.this.keys.length;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < MapOfIntInt.this.keys.length) {
+ this.key = MapOfIntInt.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = MapOfIntInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = MapOfIntInt.this.keys[this.index];
+ if (this.key == 0) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = MapOfIntInt.this.values[this.index];
+ this.index = (this.index + this.step) % MapOfIntInt.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % MapOfIntInt.this.keys.length;
+ }
+ }
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntLong.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntLong.java
new file mode 100644
index 0000000..8324c0f
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfIntLong.java
@@ -0,0 +1,412 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class MapOfIntLong {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private long[] values;
+ private long[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public MapOfIntLong(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntLong() {
+ this.sizeexp = 0;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfIntLong(StoreInputStream stream) throws IOException {
+ this.count = stream.readInt();
+ this.slots = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ this.keys[i] = stream.readInt();
+ }
+
+ this.values = new long[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readLong();
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.slots);
+ stream.writeInt(this.sizeexp);
+
+ for (int key : this.keys) {
+ stream.writeInt(key);
+ }
+
+ for (long value : this.values) {
+ stream.writeLong(value);
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ Arrays.fill(this.values, 0L);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(MapOfIntLong map) {
+ for(int i = 0; i < map.keys.length; ++i) {
+ int key = map.keys[i];
+ long value = map.values[i];
+ if (key == Integer.MAX_VALUE) {
+ this.put(0, value);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key, value);
+ }
+ }
+ }
+
+ public void put(int key, long value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public void insert(int key, long value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void remove(int key, long value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ public boolean contains(int key, long value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int count = 0;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public long get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return -1L;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ long[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private int key;
+ private long value;
+ private int thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.step = (key & 2147483647) % (MapOfIntLong.this.keys.length - 2) + 1;
+ this.index = (key & 2147483647) % MapOfIntLong.this.keys.length;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < MapOfIntLong.this.keys.length) {
+ this.key = MapOfIntLong.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = MapOfIntLong.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = MapOfIntLong.this.keys[this.index];
+ if (this.key == 0) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = MapOfIntLong.this.values[this.index];
+ this.index = (this.index + this.step) % MapOfIntLong.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % MapOfIntLong.this.keys.length;
+ }
+ }
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public long nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongInt.java
new file mode 100644
index 0000000..660b508
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongInt.java
@@ -0,0 +1,438 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class MapOfLongInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private long[] keys;
+ private long[] oldkeys;
+ private int[] values;
+ private int[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public MapOfLongInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfLongInt() {
+ this.sizeexp = 0;
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfLongInt(StoreInputStream stream) throws IOException {
+ this.count = stream.readInt();
+ this.slots = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new long[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ this.keys[i] = stream.readLong();
+ }
+
+ this.values = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readInt();
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.slots);
+ stream.writeInt(this.sizeexp);
+
+ for (long key : this.keys) {
+ stream.writeLong(key);
+ }
+
+ for (int value : this.values) {
+ stream.writeInt(value);
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear(int size) {
+ if (this.slots > 0) {
+ if (this.keys.length < size) {
+ Arrays.fill(this.keys, 0L);
+ } else {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0L);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(long key, int value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public int get(int key1, int key2) {
+ return this.get((long)key1 << 32 | (long)key2);
+ }
+
+ public void put(int key1, int key2, int value) {
+ this.put((long)key1 << 32 | (long)key2, value);
+ }
+
+ public void insert(int key1, int key2, int value) {
+ this.insert((long)key1 << 32 | (long)key2, value);
+ }
+
+ public void remove(int key1, int key2) {
+ this.remove((long)key1 << 32 | (long)key2);
+ }
+
+ public boolean contains(int key1, int key2) {
+ return this.contains((long)key1 << 32 | (long)key2);
+ }
+
+ public void insert(long key, int value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == -2147483648L) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void remove(long key, int value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ }
+
+ public boolean contains(long key, int value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean contains(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int count = 0;
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public void remove(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public int get(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return -1;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ long[] keys;
+ int[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0L);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ long key = this.keys[i];
+ if (key != 0L && key != Long.MIN_VALUE) {
+ int index = (int)((key & Long.MAX_VALUE) % (long)keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)keys.length - 2L)) + 1;
+
+ while(keys[index] != 0L) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private long key;
+ private int value;
+ private long thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.index = (int)((key & Long.MAX_VALUE) % (long)MapOfLongInt.this.keys.length);
+ this.step = (int)((key & Long.MAX_VALUE) % ((long)MapOfLongInt.this.keys.length - 2L)) + 1;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < MapOfLongInt.this.keys.length) {
+ this.key = MapOfLongInt.this.keys[this.index];
+ if (this.key != 0L && this.key != Long.MIN_VALUE) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = MapOfLongInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = MapOfLongInt.this.keys[this.index];
+ if (this.key == 0L) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = MapOfLongInt.this.values[this.index];
+ this.index = (this.index + this.step) % MapOfLongInt.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % MapOfLongInt.this.keys.length;
+ }
+ }
+ }
+
+ public long nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongLong.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongLong.java
new file mode 100644
index 0000000..8722c38
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/MapOfLongLong.java
@@ -0,0 +1,399 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class MapOfLongLong {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private long[] keys;
+ private long[] oldkeys;
+ private long[] values;
+ private long[] oldvalues;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public MapOfLongLong(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfLongLong() {
+ this.sizeexp = 0;
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.values = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public MapOfLongLong(StoreInputStream stream) throws IOException {
+ this.count = stream.readInt();
+ this.slots = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new long[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ this.keys[i] = stream.readLong();
+ }
+
+ this.values = new long[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readLong();
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.slots);
+ stream.writeInt(this.sizeexp);
+
+ for (long key : this.keys) {
+ stream.writeLong(key);
+ }
+
+ for (long value : this.values) {
+ stream.writeLong(value);
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0L);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(long key, long value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public void insert(long key, long value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+ boolean inserted = false;
+ int emptyIndex = -1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+ } else if (curKey == -2147483648L) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (!inserted) {
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ ++this.count;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+ }
+
+ public void remove(long key, long value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ }
+
+ public boolean contains(long key, long value) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean contains(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int count = 0;
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public void remove(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public long get(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return -1L;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ long[] keys;
+ long[] values;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0L);
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ keys = new long[SIZES[this.sizeexp]];
+ values = new long[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ long key = this.keys[i];
+ if (key != 0L && key != Long.MIN_VALUE) {
+ int index = (int)((key & Long.MAX_VALUE) % (long)keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)keys.length - 2L)) + 1;
+
+ while(keys[index] != 0L) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+
+ public class Iterator {
+ private int index = 0;
+ private int step = 0;
+ private long key;
+ private long value;
+ private long thekey;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ this.step = 0;
+ }
+
+ public void init(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.index = (int)((key & Long.MAX_VALUE) % (long)MapOfLongLong.this.keys.length);
+ this.step = (int)((key & Long.MAX_VALUE) % ((long)MapOfLongLong.this.keys.length - 2L)) + 1;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ while(this.index < MapOfLongLong.this.keys.length) {
+ this.key = MapOfLongLong.this.keys[this.index];
+ if (this.key != 0L && this.key != Long.MIN_VALUE) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = MapOfLongLong.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = MapOfLongLong.this.keys[this.index];
+ if (this.key == 0L) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ this.value = MapOfLongLong.this.values[this.index];
+ this.index = (this.index + this.step) % MapOfLongLong.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % MapOfLongLong.this.keys.length;
+ }
+ }
+ }
+
+ public long nextKey() {
+ return this.key;
+ }
+
+ public long nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/OrderedMapOfIntInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/OrderedMapOfIntInt.java
new file mode 100644
index 0000000..faf702c
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/OrderedMapOfIntInt.java
@@ -0,0 +1,520 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class OrderedMapOfIntInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ private int[] keys;
+ private int[] oldkeys;
+ private int[] values;
+ private int[] oldvalues;
+ private boolean[] secondelements;
+ private boolean[] oldsecondelements;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public OrderedMapOfIntInt(int size) {
+ this.sizeexp = 0;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public OrderedMapOfIntInt() {
+ this.sizeexp = 0;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.values = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public OrderedMapOfIntInt(StoreInputStream stream) throws IOException {
+ this.count = stream.readInt();
+ this.slots = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.keys.length; ++i) {
+ this.keys[i] = stream.readInt();
+ }
+
+ this.values = new int[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.values.length; ++i) {
+ this.values[i] = stream.readInt();
+ }
+
+ if (stream.readBoolean()) {
+ this.secondelements = new boolean[SIZES[this.sizeexp]];
+
+ for(int i = 0; i < this.secondelements.length; ++i) {
+ this.secondelements[i] = stream.readBoolean();
+ }
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.slots);
+ stream.writeInt(this.sizeexp);
+
+ for (int key : this.keys) {
+ stream.writeInt(key);
+ }
+
+ for (int value : this.values) {
+ stream.writeInt(value);
+ }
+
+ stream.writeBoolean(this.secondelements != null);
+ if (this.secondelements != null) {
+ for (boolean secondelement : this.secondelements) {
+ stream.writeBoolean(secondelement);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ if (this.secondelements != null) {
+ Arrays.fill(this.secondelements, false);
+ }
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void insert(OrderedMapOfIntInt map) {
+ for(int i = 0; i < map.keys.length; ++i) {
+ int key = map.keys[i];
+ int value = map.values[i];
+ if (key == Integer.MAX_VALUE) {
+ this.insert(0, value);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.insert(key, value);
+ }
+ }
+ }
+
+ public void put(int key, int value) {
+ this.remove(key);
+ this.insert(key, value);
+ }
+
+ public void insert(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ boolean second = false;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ if (this.values[index] == value) {
+ return;
+ }
+
+ second = true;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = key;
+ this.values[index] = value;
+ if (second) {
+ if (this.secondelements == null) {
+ this.secondelements = new boolean[this.keys.length];
+ }
+
+ this.secondelements[index] = true;
+ }
+
+ ++this.count;
+ ++this.slots;
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public boolean contains(int key, int value) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key || this.values[index] != value; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public int count(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int count = 0;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ ++count;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return count;
+ }
+
+ public int get(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return -1;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return this.values[index];
+ }
+
+ private void rehash() {
+ int[] keys;
+ int[] values;
+ boolean[] secondelements;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ this.oldvalues = null;
+ this.oldsecondelements = null;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ if (this.secondelements != null) {
+ secondelements = new boolean[SIZES[this.sizeexp]];
+ } else {
+ secondelements = null;
+ }
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ if (this.oldsecondelements != null) {
+ secondelements = this.oldsecondelements;
+
+ Arrays.fill(secondelements, false);
+ } else {
+ secondelements = null;
+ }
+
+ values = this.oldvalues;
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ this.oldsecondelements = this.secondelements;
+ } else {
+ this.oldkeys = this.keys;
+ this.oldvalues = this.values;
+ this.oldsecondelements = this.secondelements;
+ keys = new int[SIZES[this.sizeexp]];
+ values = new int[SIZES[this.sizeexp]];
+ if (this.secondelements != null) {
+ secondelements = new boolean[SIZES[this.sizeexp]];
+ } else {
+ secondelements = null;
+ }
+ }
+
+ int slots = 0;
+ if (this.secondelements == null) {
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ }
+ }
+ } else {
+ for(int i = 0; i < this.keys.length; ++i) {
+ int key = this.keys[i];
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+ if (!this.secondelements[i]) {
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[i];
+ ++slots;
+ int oldstep = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int oldindex = (key & 2147483647) % this.keys.length; this.keys[oldindex] != 0; oldindex = (oldindex + oldstep) % this.keys.length) {
+ if (this.keys[oldindex] == key && oldindex != i) {
+ while(keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ values[index] = this.values[oldindex];
+ if (secondelements != null) {
+ secondelements[index] = true;
+ }
+
+ ++slots;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ this.secondelements = secondelements;
+ this.keys = keys;
+ this.values = values;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ public class Iterator {
+ private int index;
+ private int step;
+ private int newindex;
+ private int newstep;
+ private int key;
+ private int value;
+ private int thekey;
+
+ private Iterator() {
+ if (OrderedMapOfIntInt.this.secondelements == null) {
+ this.index = 0;
+ this.step = -1;
+ } else {
+ this.index = 0;
+ this.step = 0;
+ this.newstep = 0;
+ }
+ }
+
+ public void init() {
+ if (OrderedMapOfIntInt.this.secondelements == null) {
+ this.index = 0;
+ this.step = -1;
+ } else {
+ this.index = 0;
+ this.step = 0;
+ this.newstep = 0;
+ }
+ }
+
+ public void init(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ this.thekey = key;
+ this.step = (key & 2147483647) % (OrderedMapOfIntInt.this.keys.length - 2) + 1;
+ this.index = (key & 2147483647) % OrderedMapOfIntInt.this.keys.length;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.step == 0) {
+ if (this.newstep == 0) {
+ while(this.index < OrderedMapOfIntInt.this.keys.length) {
+ this.key = OrderedMapOfIntInt.this.keys[this.index];
+ if (!OrderedMapOfIntInt.this.secondelements[this.index] && this.key != 0 && this.key != Integer.MIN_VALUE) {
+ this.newstep = (this.key & 2147483647) % (OrderedMapOfIntInt.this.keys.length - 2) + 1;
+ this.newindex = (this.key & 2147483647) % OrderedMapOfIntInt.this.keys.length;
+ this.thekey = this.key;
+ ++this.index;
+ return this.hasMoreElements();
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = OrderedMapOfIntInt.this.keys[this.newindex];
+ if (this.key == 0) {
+ this.newstep = 0;
+ return this.hasMoreElements();
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = OrderedMapOfIntInt.this.values[this.newindex];
+ this.newindex = (this.newindex + this.newstep) % OrderedMapOfIntInt.this.keys.length;
+ return true;
+ }
+
+ this.newindex = (this.newindex + this.newstep) % OrderedMapOfIntInt.this.keys.length;
+ }
+ }
+ } else if (this.step == -1) {
+ while(this.index < OrderedMapOfIntInt.this.keys.length) {
+ this.key = OrderedMapOfIntInt.this.keys[this.index];
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = OrderedMapOfIntInt.this.values[this.index];
+ ++this.index;
+ return true;
+ }
+
+ ++this.index;
+ }
+
+ return false;
+ } else {
+ while(true) {
+ this.key = OrderedMapOfIntInt.this.keys[this.index];
+ if (this.key == 0) {
+ return false;
+ }
+
+ if (this.key == this.thekey) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ this.value = OrderedMapOfIntInt.this.values[this.index];
+ this.index = (this.index + this.step) % OrderedMapOfIntInt.this.keys.length;
+ return true;
+ }
+
+ this.index = (this.index + this.step) % OrderedMapOfIntInt.this.keys.length;
+ }
+ }
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/RelationOfIntInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/RelationOfIntInt.java
similarity index 87%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/RelationOfIntInt.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/RelationOfIntInt.java
index c837e92..06f495d 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/RelationOfIntInt.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/RelationOfIntInt.java
@@ -1,8 +1,4 @@
-package com.apkide.analysis.api.clm.collections;
-
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.SetOfInt;
+package com.apkide.analysis.clm.api.collections;
import java.io.IOException;
import java.util.Arrays;
@@ -78,15 +74,16 @@ public RelationOfIntInt(StoreInputStream stream) throws IOException {
}
}
- public void remove(SetOfFileEntry set) {
+ public void remove(SetOfFileEntry value1s) {
for(int i = 0; i < this.keys.length; ++i) {
long key = this.keys[i];
if (key != 0L && key != Long.MIN_VALUE) {
- if (key == Long.MAX_VALUE)
+ if (key == Long.MAX_VALUE) {
key = 0L;
+ }
- int K = (int)(key >> 32);
- if (set.contains(K)) {
+ int v1 = (int)(key >> 32);
+ if (value1s.contains(v1)) {
this.keys[i] = Long.MIN_VALUE;
--this.count;
}
@@ -120,23 +117,26 @@ public void clear() {
public void put(RelationOfIntInt relation) {
for(int i = 0; i < relation.keys.length; ++i) {
long key = relation.keys[i];
- if (key == Long.MAX_VALUE)
- put(0L);
- else if (key != 0L && key != Long.MIN_VALUE)
- put(key);
+ if (key == Long.MAX_VALUE) {
+ this.put(0L);
+ } else if (key != 0L && key != Long.MIN_VALUE) {
+ this.put(key);
+ }
}
}
public void put(long key) {
- if (key == 0L)
+ if (key == 0L) {
key = Long.MAX_VALUE;
+ }
int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
- if (curKey == key)
+ if (curKey == key) {
return;
+ }
index = (index + step) % this.keys.length;
}
@@ -144,21 +144,24 @@ public void put(long key) {
this.keys[index] = key;
++this.count;
++this.slots;
- if (this.slots * LOAD_FACTOR > this.keys.length)
- rehash();
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
}
public void put(int value1, int value2) {
long key = (long)value1 << 32 | (long)value2;
- if (key == 0L)
+ if (key == 0L) {
key = Long.MAX_VALUE;
+ }
int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
for(long curKey = this.keys[index]; curKey != 0L; curKey = this.keys[index]) {
- if (curKey == key)
+ if (curKey == key) {
return;
+ }
index = (index + step) % this.keys.length;
}
@@ -166,21 +169,24 @@ public void put(int value1, int value2) {
this.keys[index] = key;
++this.count;
++this.slots;
- if (this.slots * LOAD_FACTOR > this.keys.length)
- rehash();
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
}
public void remove(int value1, int value2) {
long key = (long)value1 << 32 | (long)value2;
- if (key == 0L)
+ if (key == 0L) {
key = Long.MAX_VALUE;
+ }
int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0L)
+ if (curKey == 0L) {
return;
+ }
index = (index + step) % this.keys.length;
}
@@ -193,8 +199,9 @@ public void remove(int value1) {
for(int i = 0; i < this.keys.length; ++i) {
long key = this.keys[i];
if (key != 0L && key != Long.MIN_VALUE) {
- if (key == Long.MAX_VALUE)
+ if (key == Long.MAX_VALUE) {
key = 0L;
+ }
int v1 = (int)(key >> 32);
if (v1 == value1) {
@@ -209,8 +216,9 @@ public void remove(SetOfInt value1s) {
for(int i = 0; i < this.keys.length; ++i) {
long key = this.keys[i];
if (key != 0L && key != Long.MIN_VALUE) {
- if (key == Long.MAX_VALUE)
+ if (key == Long.MAX_VALUE) {
key = 0L;
+ }
int v1 = (int)(key >> 32);
if (value1s.contains(v1)) {
@@ -223,15 +231,17 @@ public void remove(SetOfInt value1s) {
public boolean contains(int value1, int value2) {
long key = (long)value1 << 32 | (long)value2;
- if (key == 0L)
+ if (key == 0L) {
key = Long.MAX_VALUE;
+ }
int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0L)
+ if (curKey == 0L) {
return false;
+ }
index = (index + step) % this.keys.length;
}
@@ -245,7 +255,7 @@ public boolean empty() {
private void rehash() {
long[] keys;
- if (this.count * LOAD_FACTOR > this.keys.length) {
+ if (this.count * 2 > this.keys.length) {
++this.sizeexp;
this.oldkeys = null;
keys = new long[SIZES[this.sizeexp]];
@@ -291,7 +301,6 @@ public int totalSize() {
public int size() {
return this.count;
}
-
public class Iterator {
private int index = 0;
private int value1;
@@ -309,8 +318,9 @@ public boolean hasMoreElements() {
long key = RelationOfIntInt.this.keys[this.index];
++this.index;
if (key != 0L && key != Long.MIN_VALUE) {
- if (key == Long.MAX_VALUE)
+ if (key == Long.MAX_VALUE) {
key = 0L;
+ }
this.value1 = (int)(key >> 32);
this.value2 = (int)(key);
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ScopeOf.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOf.java
similarity index 63%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ScopeOf.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOf.java
index 379fb8d..2552305 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/ScopeOf.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOf.java
@@ -1,10 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
+package com.apkide.analysis.clm.api.collections;
-
-import static java.lang.System.arraycopy;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.util.Arrays;
@@ -24,22 +21,25 @@ public ScopeOf(EntitySpace space) {
}
public void declare(int identifier, E binding) {
- if (this.identifierHashTable.length < this.stackPos * 3)
- rehash();
+ if (this.identifierHashTable.length < this.stackPos * 3) {
+ this.rehash();
+ }
- if (this.identifierStack.length <= this.stackPos)
- resize();
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
this.identifierStack[this.stackPos] = identifier;
this.bindingStack[this.stackPos] = this.space.getID(binding);
++this.stackPos;
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
while(identifierHashTable[index] != 0) {
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
+ }
}
identifierHashTable[index] = identifier;
@@ -49,24 +49,20 @@ public void declare(int identifier, E binding) {
public E get(int identifier) {
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
int bi = -1;
- int id = identifierHashTable[index];
- if (id == identifier)
- bi = this.bindingHashTable[index];
-
- if (++index >= identifierHashTableLength)
- index = 0;
-
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier)
+ if (id == identifier) {
bi = this.bindingHashTable[index];
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
return (E)this.space.getEntity(bi);
}
@@ -74,37 +70,35 @@ public E get(int identifier) {
public boolean contains(int identifier) {
int[] identifierHashTable = this.identifierHashTable;
int identifierHashTableLength = identifierHashTable.length;
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
- int id = identifierHashTable[index];
- if (id == identifier)
- return true;
-
- if (++index >= identifierHashTableLength)
- index = 0;
-
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier)
+ if (id == identifier) {
return true;
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
return false;
}
public void clear() {
- if (this.stackPos > 0)
+ if (this.stackPos > 0) {
Arrays.fill(this.identifierHashTable, 0);
+ }
this.stackPos = 0;
}
public void enterBlock() {
- if (this.identifierStack.length <= this.stackPos)
- resize();
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
this.identifierStack[this.stackPos] = 0;
++this.stackPos;
@@ -115,30 +109,25 @@ public void leaveBlock() {
int identifierHashTableLength = identifierHashTable.length;
--this.stackPos;
- for(int identifier = this.identifierStack[this.stackPos];
- identifier != 0; identifier = this.identifierStack[this.stackPos]) {
-
- int index = (identifier & Integer.MAX_VALUE) % identifierHashTableLength;
+ for(int identifier = this.identifierStack[this.stackPos]; identifier != 0; identifier = this.identifierStack[this.stackPos]) {
+ int index = (identifier & 2147483647) % identifierHashTableLength;
int i = -1;
- int id = identifierHashTable[index];
- if (id == identifier)
- i = index;
-
- if (++index >= identifierHashTableLength)
- index = 0;
-
- while (id != 0) {
+ int id;
+ do {
id = identifierHashTable[index];
- if (id == identifier)
+ if (id == identifier) {
i = index;
+ }
- if (++index >= identifierHashTableLength)
+ if (++index >= identifierHashTableLength) {
index = 0;
- }
+ }
+ } while(id != 0);
- if (i != -1)
+ if (i != -1) {
identifierHashTable[i] = 0;
+ }
--this.stackPos;
}
@@ -146,13 +135,13 @@ public void leaveBlock() {
private void resize() {
int[] newidentifierStack = new int[this.identifierStack.length * 2 + 1];
- arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
+ System.arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
this.identifierStack = newidentifierStack;
int[] newbindingStack = new int[this.bindingStack.length * 2 + 1];
- arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
+ System.arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
this.bindingStack = newbindingStack;
int[] newslotStack = new int[this.slotStack.length * 2 + 1];
- arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
+ System.arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
this.slotStack = newslotStack;
}
@@ -165,11 +154,12 @@ private void rehash() {
int identifier = this.identifierStack[i];
if (identifier != 0) {
int binding = this.bindingStack[i];
- int index = (identifier & Integer.MAX_VALUE) % newidentifierHashTable.length;
+ int index = (identifier & 2147483647) % newidentifierHashTable.length;
while(newidentifierHashTable[index] != 0) {
- if (++index >= newidentifierHashTable.length)
+ if (++index >= newidentifierHashTable.length) {
index = 0;
+ }
}
newidentifierHashTable[index] = identifier;
@@ -195,19 +185,18 @@ public void init() {
}
public boolean hasMoreElements() {
- if (this.pos >= ScopeOf.this.stackPos)
- return false;
- else {
- while(this.pos < ScopeOf.this.stackPos) {
+ if (this.pos < ScopeOf.this.stackPos) {
+ while (this.pos < ScopeOf.this.stackPos) {
this.key = ScopeOf.this.identifierStack[this.pos];
this.value = ScopeOf.this.bindingStack[this.pos];
++this.pos;
- if (this.key != 0)
+ if (this.key != 0) {
return true;
+ }
}
- return false;
}
+ return false;
}
public int nextKey() {
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOfInt.java
new file mode 100644
index 0000000..57fac31
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/ScopeOfInt.java
@@ -0,0 +1,205 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.util.Arrays;
+
+public class ScopeOfInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private int[] identifierHashTable = new int[3000];
+ private int[] bindingHashTable = new int[3000];
+ private int[] scopeHashTable = new int[3000];
+ private int[] identifierStack = new int[1000];
+ private int[] bindingStack = new int[1000];
+ private int[] slotStack = new int[1000];
+ private int stackPos = 0;
+
+ public ScopeOfInt() {
+ }
+
+ public void declare(int identifier, int binding) {
+ if (this.identifierHashTable.length < this.stackPos * 3) {
+ this.rehash();
+ }
+
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
+
+ this.identifierStack[this.stackPos] = identifier;
+ this.bindingStack[this.stackPos] = binding;
+ ++this.stackPos;
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+
+ while(identifierHashTable[index] != 0) {
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ }
+
+ identifierHashTable[index] = identifier;
+ this.bindingHashTable[index] = binding;
+ }
+
+ public int get(int identifier) {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+ int bi = -1;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier) {
+ bi = this.bindingHashTable[index];
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ return bi;
+ }
+
+ public boolean contains(int identifier) {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier) {
+ return true;
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ return false;
+ }
+
+ public void clear() {
+ if (this.stackPos > 0) {
+ Arrays.fill(this.identifierHashTable, 0);
+ }
+
+ this.stackPos = 0;
+ }
+
+ public void enterBlock() {
+ if (this.identifierStack.length <= this.stackPos) {
+ this.resize();
+ }
+
+ this.identifierStack[this.stackPos] = 0;
+ ++this.stackPos;
+ }
+
+ public void leaveBlock() {
+ int[] identifierHashTable = this.identifierHashTable;
+ int identifierHashTableLength = identifierHashTable.length;
+ --this.stackPos;
+
+ for(int identifier = this.identifierStack[this.stackPos]; identifier != 0; identifier = this.identifierStack[this.stackPos]) {
+ int index = (identifier & 2147483647) % identifierHashTableLength;
+ int i = -1;
+
+ int id;
+ do {
+ id = identifierHashTable[index];
+ if (id == identifier) {
+ i = index;
+ }
+
+ if (++index >= identifierHashTableLength) {
+ index = 0;
+ }
+ } while(id != 0);
+
+ if (i != -1) {
+ identifierHashTable[i] = 0;
+ }
+
+ --this.stackPos;
+ }
+ }
+
+ private void resize() {
+ int[] newidentifierStack = new int[this.identifierStack.length * 2 + 1];
+ System.arraycopy(this.identifierStack, 0, newidentifierStack, 0, this.identifierStack.length);
+ this.identifierStack = newidentifierStack;
+ int[] newbindingStack = new int[this.bindingStack.length * 2 + 1];
+ System.arraycopy(this.bindingStack, 0, newbindingStack, 0, this.bindingStack.length);
+ this.bindingStack = newbindingStack;
+ int[] newslotStack = new int[this.slotStack.length * 2 + 1];
+ System.arraycopy(this.slotStack, 0, newslotStack, 0, this.slotStack.length);
+ this.slotStack = newslotStack;
+ }
+
+ private void rehash() {
+ int[] newidentifierHashTable = new int[this.identifierHashTable.length * 2 + 1];
+ int[] newbindingHashTable = new int[this.identifierHashTable.length * 2 + 1];
+ int[] newscopeHashTable = new int[this.identifierHashTable.length * 2 + 1];
+
+ for(int i = 0; i < this.stackPos; ++i) {
+ int identifier = this.identifierStack[i];
+ if (identifier != 0) {
+ int binding = this.bindingStack[i];
+ int index = (identifier & 2147483647) % newidentifierHashTable.length;
+
+ while(newidentifierHashTable[index] != 0) {
+ if (++index >= newidentifierHashTable.length) {
+ index = 0;
+ }
+ }
+
+ newidentifierHashTable[index] = identifier;
+ newbindingHashTable[index] = binding;
+ }
+ }
+
+ this.identifierHashTable = newidentifierHashTable;
+ this.scopeHashTable = newscopeHashTable;
+ this.bindingHashTable = newbindingHashTable;
+ }
+
+ public class Iterator {
+ private int pos = 0;
+ private int key;
+ private int value;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.pos = 0;
+ }
+
+ public boolean hasMoreElements() {
+ if (this.pos < ScopeOfInt.this.stackPos) {
+ while (this.pos < ScopeOfInt.this.stackPos) {
+ this.key = ScopeOfInt.this.identifierStack[this.pos];
+ this.value = ScopeOfInt.this.bindingStack[this.pos];
+ ++this.pos;
+ if (this.key != 0) {
+ return true;
+ }
+ }
+
+ }
+ return false;
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+
+ public int nextValue() {
+ return this.value;
+ }
+ }
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOf.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOf.java
similarity index 71%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOf.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOf.java
index ddf05c3..a056005 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOf.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOf.java
@@ -1,15 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
-
-
-import static java.lang.Integer.MAX_VALUE;
-import static java.lang.Integer.MIN_VALUE;
-
-import com.apkide.analysis.api.clm.Entity;
-import com.apkide.analysis.api.clm.EntitySpace;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.SetOfInt;
+package com.apkide.analysis.clm.api.collections;
+import com.apkide.analysis.clm.api.Entity;
+import com.apkide.analysis.clm.api.EntitySpace;
import java.io.IOException;
import java.util.Arrays;
@@ -59,7 +51,7 @@ public SetOf(EntitySpace space, int size) {
this.space = space;
this.sizeexp = 1;
- while(SIZES[this.sizeexp] < size * LOAD_FACTOR) {
+ while(SIZES[this.sizeexp] < size * 2) {
++this.sizeexp;
}
@@ -85,7 +77,7 @@ public SetOf(EntitySpace space, StoreInputStream stream) throws IOException {
this.count = 0;
for(int i = 0; i < count; ++i) {
- put(stream.readInt());
+ this.put(stream.readInt());
}
}
@@ -94,8 +86,9 @@ public void store(StoreOutputStream stream) throws IOException {
stream.writeInt(this.sizeexp);
for (int key : this.keys) {
- if (key != 0 && key != MIN_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
stream.writeInt(key);
+ }
}
}
@@ -115,81 +108,91 @@ public void clear() {
public void put(SetOf extends E> set) {
for(int i = 0; i < set.keys.length; ++i) {
int key = set.keys[i];
- if (key == MAX_VALUE)
- put(0);
- else if (key != 0 && key != MIN_VALUE)
- put(key);
+ if (key == Integer.MAX_VALUE) {
+ this.put(0);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key);
+ }
}
}
public void put(ListOf extends E> vec) {
for(int i = 0; i < vec.size(); ++i) {
- put(vec.get(i));
+ this.put(vec.get(i));
}
}
public void put(E entity) {
- if (entity == null)
- put(-1);
- else
- put(this.space.getID(entity));
+ if (entity == null) {
+ this.put(-1);
+ } else {
+ this.put(this.space.getID(entity));
+ }
}
private void put(int key) {
- if (key == 0)
- key = MAX_VALUE;
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
- int index = (key & MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
int curKey = this.keys[index];
int emptyIndex;
for(emptyIndex = -1; curKey != 0; curKey = this.keys[index]) {
- if (curKey == key)
+ if (curKey == key) {
return;
+ }
- if (curKey == MIN_VALUE)
+ if (curKey == Integer.MIN_VALUE) {
emptyIndex = index;
+ }
index = (index + step) % this.keys.length;
}
- if (emptyIndex != -1)
+ if (emptyIndex != -1) {
index = emptyIndex;
+ }
this.keys[index] = key;
- if (emptyIndex == -1)
+ if (emptyIndex == -1) {
++this.slots;
+ }
++this.count;
- if (this.slots * LOAD_FACTOR > this.keys.length)
- rehash();
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
}
public void remove(SetOf extends E> keys) {
keys.DEFAULT_ITERATOR.init();
while(keys.DEFAULT_ITERATOR.hasMoreElements()) {
- remove(keys.DEFAULT_ITERATOR.nextKey());
+ this.remove(keys.DEFAULT_ITERATOR.nextKey());
}
}
public void remove(Entity entity) {
int key = this.space.getID(entity);
- if (key == 0)
- key = MAX_VALUE;
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return;
+ }
index = (index + step) % this.keys.length;
}
- this.keys[index] = MIN_VALUE;
+ this.keys[index] = Integer.MIN_VALUE;
--this.count;
}
@@ -199,9 +202,10 @@ public E get() {
while(index < this.keys.length) {
int key = this.keys[index];
++index;
- if (key != 0 && key != MIN_VALUE) {
- if (key == MAX_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
key = 0;
+ }
return (E)this.space.getEntity(key);
}
@@ -212,15 +216,17 @@ public E get() {
public boolean contains(Entity entity) {
int key = this.space.getID(entity);
- if (key == 0)
- key = MAX_VALUE;
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
- int step = (key & Integer.MAX_VALUE) % (this.keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return false;
+ }
index = (index + step) % this.keys.length;
}
@@ -234,7 +240,7 @@ public boolean empty() {
private void rehash() {
int[] keys;
- if (this.count * LOAD_FACTOR > this.keys.length) {
+ if (this.count * 2 > this.keys.length) {
++this.sizeexp;
this.oldkeys = null;
keys = new int[SIZES[this.sizeexp]];
@@ -252,9 +258,9 @@ private void rehash() {
int slots = 0;
for (int key : this.keys) {
- if (key != 0 && key != MIN_VALUE) {
- int step = (key & Integer.MAX_VALUE) % (keys.length - 2) + 1;
- int index = (key & Integer.MAX_VALUE) % keys.length;
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
while (keys[index] != 0) {
index = (index + step) % keys.length;
@@ -272,6 +278,7 @@ private void rehash() {
public int size() {
return this.count;
}
+
@Override
public boolean equals(Object o) {
if (!(o instanceof SetOfInt)) {
@@ -283,12 +290,14 @@ public boolean equals(Object o) {
} else {
for (int j : this.keys) {
int key = j;
- if (key != 0 && key != MIN_VALUE) {
- if (key == MAX_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
key = 0;
+ }
- if (!set.contains(key))
+ if (!set.contains(key)) {
return false;
+ }
}
}
@@ -312,9 +321,10 @@ public boolean hasMoreElements() {
while(this.index < SetOf.this.keys.length) {
this.key = SetOf.this.keys[this.index];
++this.index;
- if (this.key != 0 && this.key != MIN_VALUE) {
- if (this.key == MAX_VALUE)
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
this.key = 0;
+ }
return true;
}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOfFileEntry.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfFileEntry.java
similarity index 71%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOfFileEntry.java
rename to cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfFileEntry.java
index 6033168..3bc0a38 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/collections/SetOfFileEntry.java
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfFileEntry.java
@@ -1,15 +1,7 @@
-package com.apkide.analysis.api.clm.collections;
-
-
-import static java.lang.Integer.MAX_VALUE;
-import static java.lang.Integer.MIN_VALUE;
-
-import com.apkide.analysis.api.clm.FileEntry;
-import com.apkide.analysis.api.clm.FileSpace;
-import com.apkide.common.StoreInputStream;
-import com.apkide.common.StoreOutputStream;
-import com.apkide.common.collections.SetOfInt;
+package com.apkide.analysis.clm.api.collections;
+import com.apkide.analysis.clm.api.FileEntry;
+import com.apkide.analysis.clm.api.FileSpace;
import java.io.IOException;
import java.util.Arrays;
@@ -82,8 +74,9 @@ public void store(StoreOutputStream stream) throws IOException {
stream.writeInt(this.sizeexp);
for (int key : this.keys) {
- if (key != 0 && key != MIN_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
stream.writeInt(key);
+ }
}
}
@@ -103,64 +96,74 @@ public void clear() {
public void put(SetOfFileEntry set) {
for(int i = 0; i < set.keys.length; ++i) {
int key = set.keys[i];
- if (key == MAX_VALUE)
- put(0);
- else if (key != 0 && key != MIN_VALUE)
- put(key);
+ if (key == Integer.MAX_VALUE) {
+ this.put(0);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key);
+ }
}
}
public void put(FileEntry file) {
- put(this.filespace.getID(file));
+ int key = this.filespace.getID(file);
+ this.put(key);
}
private void put(int key) {
- if (key == 0)
- key = MAX_VALUE;
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
- int index = (key & MAX_VALUE) % this.keys.length;
- int step = (key & MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
int curKey = this.keys[index];
int emptyIndex;
for(emptyIndex = -1; curKey != 0; curKey = this.keys[index]) {
- if (curKey == key)
+ if (curKey == key) {
return;
+ }
- if (curKey == MIN_VALUE)
+ if (curKey == Integer.MIN_VALUE) {
emptyIndex = index;
+ }
index = (index + step) % this.keys.length;
}
- if (emptyIndex != -1)
+ if (emptyIndex != -1) {
index = emptyIndex;
+ }
this.keys[index] = key;
- if (emptyIndex == -1)
+ if (emptyIndex == -1) {
++this.slots;
+ }
++this.count;
- if (this.slots * LOAD_FACTOR > this.keys.length)
- rehash();
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
}
public void remove(FileEntry file) {
int key = this.filespace.getID(file);
- if (key == 0)
- key = MAX_VALUE;
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
- int index = (key & MAX_VALUE) % this.keys.length;
- int step = (key & MAX_VALUE) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return;
+ }
index = (index + step) % this.keys.length;
}
- this.keys[index] = MIN_VALUE;
+ this.keys[index] = Integer.MIN_VALUE;
--this.count;
}
@@ -170,9 +173,10 @@ public FileEntry get() {
while(index < this.keys.length) {
int key = this.keys[index];
++index;
- if (key != 0 && key != MIN_VALUE) {
- if (key == MAX_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
key = 0;
+ }
return this.filespace.getFileEntry(key);
}
@@ -182,19 +186,21 @@ public FileEntry get() {
}
public boolean contains(FileEntry file) {
- return contains(this.filespace.getID(file));
+ return this.contains(this.filespace.getID(file));
}
public boolean contains(int id) {
- if (id == 0)
- id = MAX_VALUE;
+ if (id == 0) {
+ id = Integer.MAX_VALUE;
+ }
- int step = (id & MAX_VALUE) % (this.keys.length - 2) + 1;
- int index = (id & MAX_VALUE) % this.keys.length;
+ int step = (id & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (id & 2147483647) % this.keys.length;
for(int curKey = this.keys[index]; curKey != id; curKey = this.keys[index]) {
- if (curKey == 0)
+ if (curKey == 0) {
return false;
+ }
index = (index + step) % this.keys.length;
}
@@ -208,7 +214,7 @@ public boolean empty() {
private void rehash() {
int[] keys;
- if (this.count * LOAD_FACTOR > this.keys.length) {
+ if (this.count * 2 > this.keys.length) {
++this.sizeexp;
this.oldkeys = null;
keys = new int[SIZES[this.sizeexp]];
@@ -226,9 +232,9 @@ private void rehash() {
int slots = 0;
for (int key : this.keys) {
- if (key != 0 && key != MIN_VALUE) {
- int step = (key & MAX_VALUE) % (keys.length - 2) + 1;
- int index = (key & MAX_VALUE) % keys.length;
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
while (keys[index] != 0) {
index = (index + step) % keys.length;
@@ -258,12 +264,14 @@ public boolean equals(Object o) {
} else {
for (int j : this.keys) {
int key = j;
- if (key != 0 && key != MIN_VALUE) {
- if (key == MAX_VALUE)
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
key = 0;
+ }
- if (!set.contains(key))
+ if (!set.contains(key)) {
return false;
+ }
}
}
@@ -287,9 +295,10 @@ public boolean hasMoreElements() {
while(this.index < SetOfFileEntry.this.keys.length) {
this.key = SetOfFileEntry.this.keys[this.index];
++this.index;
- if (this.key != 0 && this.key != MIN_VALUE) {
- if (this.key == MAX_VALUE)
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
this.key = 0;
+ }
return true;
}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfInt.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfInt.java
new file mode 100644
index 0000000..74b8c58
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfInt.java
@@ -0,0 +1,326 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class SetOfInt {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ public static final SetOfInt EMPTY = new SetOfInt();
+ private int[] keys;
+ private int[] oldkeys;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public SetOfInt(int size) {
+ this.sizeexp = 1;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public SetOfInt() {
+ this.sizeexp = 1;
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public SetOfInt(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new int[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.put(stream.readInt());
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for (int key : this.keys) {
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ stream.writeInt(key);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(SetOfInt set) {
+ for(int i = 0; i < set.keys.length; ++i) {
+ int key = set.keys[i];
+ if (key == Integer.MAX_VALUE) {
+ this.put(0);
+ } else if (key != 0 && key != Integer.MIN_VALUE) {
+ this.put(key);
+ }
+ }
+ }
+
+ public void put(ListOfInt vec) {
+ for(int i = 0; i < vec.size(); ++i) {
+ int key = vec.get(i);
+ this.put(key);
+ }
+ }
+
+ public void put(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int curKey = this.keys[index];
+
+ int emptyIndex;
+ for(emptyIndex = -1; curKey != 0; curKey = this.keys[index]) {
+ if (curKey == key) {
+ return;
+ }
+
+ if (curKey == Integer.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ ++this.count;
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public void remove(SetOfInt keys) {
+ keys.DEFAULT_ITERATOR.init();
+
+ while(keys.DEFAULT_ITERATOR.hasMoreElements()) {
+ this.remove(keys.DEFAULT_ITERATOR.nextKey());
+ }
+ }
+
+ public void remove(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int index = (key & 2147483647) % this.keys.length;
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Integer.MIN_VALUE;
+ --this.count;
+ }
+
+ public int get() {
+ int index = 0;
+
+ while(index < this.keys.length) {
+ int key = this.keys[index];
+ ++index;
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
+ key = 0;
+ }
+
+ return key;
+ }
+ }
+
+ return -1;
+ }
+
+ public boolean contains(int key) {
+ if (key == 0) {
+ key = Integer.MAX_VALUE;
+ }
+
+ int step = (key & 2147483647) % (this.keys.length - 2) + 1;
+ int index = (key & 2147483647) % this.keys.length;
+
+ for(int curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean empty() {
+ return this.count == 0;
+ }
+
+ private void rehash() {
+ int[] keys;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ keys = new int[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0);
+
+ this.oldkeys = this.keys;
+ } else {
+ this.oldkeys = this.keys;
+ keys = new int[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for (int key : this.keys) {
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ int step = (key & 2147483647) % (keys.length - 2) + 1;
+ int index = (key & 2147483647) % keys.length;
+
+ while (keys[index] != 0) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof SetOfInt)) {
+ return false;
+ } else {
+ SetOfInt set = (SetOfInt)o;
+ if (set.size() != this.size()) {
+ return false;
+ } else {
+ for (int j : this.keys) {
+ int key = j;
+ if (key != 0 && key != Integer.MIN_VALUE) {
+ if (key == Integer.MAX_VALUE) {
+ key = 0;
+ }
+
+ if (!set.contains(key)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private int key;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ }
+
+ public boolean hasMoreElements() {
+ while(this.index < SetOfInt.this.keys.length) {
+ this.key = SetOfInt.this.keys[this.index];
+ ++this.index;
+ if (this.key != 0 && this.key != Integer.MIN_VALUE) {
+ if (this.key == Integer.MAX_VALUE) {
+ this.key = 0;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public int nextKey() {
+ return this.key;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfLong.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfLong.java
new file mode 100644
index 0000000..7c2e258
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/SetOfLong.java
@@ -0,0 +1,301 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+public class SetOfLong {
+ public final Iterator DEFAULT_ITERATOR = new Iterator();
+ private static final int LOAD_FACTOR = 2;
+ private static final int[] SIZES = new int[]{
+ 5,
+ 11,
+ 17,
+ 37,
+ 67,
+ 131,
+ 257,
+ 521,
+ 1031,
+ 2053,
+ 4099,
+ 8209,
+ 16411,
+ 32771,
+ 65537,
+ 131101,
+ 262147,
+ 524309,
+ 1048583,
+ 2097169,
+ 4194319,
+ 8388617,
+ 16777259,
+ 33554467,
+ 67108879,
+ 134217757,
+ 268435459,
+ 536870923,
+ 1073741827,
+ 2147383649
+ };
+ public static final SetOfLong EMPTY = new SetOfLong();
+ private long[] keys;
+ private long[] oldkeys;
+ private int slots;
+ private int count;
+ private int sizeexp;
+
+ public SetOfLong(int size) {
+ this.sizeexp = 1;
+
+ while(SIZES[this.sizeexp] < size * 2) {
+ ++this.sizeexp;
+ }
+
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public SetOfLong() {
+ this.sizeexp = 1;
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+ }
+
+ public SetOfLong(StoreInputStream stream) throws IOException {
+ int count = stream.readInt();
+ this.sizeexp = stream.readInt();
+ this.keys = new long[SIZES[this.sizeexp]];
+ this.slots = 0;
+ this.count = 0;
+
+ for(int i = 0; i < count; ++i) {
+ this.put(stream.readLong());
+ }
+ }
+
+ public void store(StoreOutputStream stream) throws IOException {
+ stream.writeInt(this.count);
+ stream.writeInt(this.sizeexp);
+
+ for (long key : this.keys) {
+ if (key != 0L && key != Long.MIN_VALUE) {
+ stream.writeLong(key);
+ }
+ }
+ }
+
+ public Iterator createIterator() {
+ return new Iterator();
+ }
+
+ public void clear() {
+ if (this.slots > 0) {
+ Arrays.fill(this.keys, 0L);
+
+ this.slots = 0;
+ this.count = 0;
+ }
+ }
+
+ public void put(SetOfLong set) {
+ for(int i = 0; i < set.keys.length; ++i) {
+ long key = set.keys[i];
+ if (key == Long.MAX_VALUE) {
+ this.put(0L);
+ } else if (key != 0L && key != Long.MIN_VALUE) {
+ this.put(key);
+ }
+ }
+ }
+
+ public void put(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+ long curKey = this.keys[index];
+
+ int emptyIndex;
+ for(emptyIndex = -1; curKey != 0L; curKey = this.keys[index]) {
+ if (curKey == key) {
+ return;
+ }
+
+ if (curKey == Long.MIN_VALUE) {
+ emptyIndex = index;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ if (emptyIndex != -1) {
+ index = emptyIndex;
+ }
+
+ this.keys[index] = key;
+ if (emptyIndex == -1) {
+ ++this.slots;
+ }
+
+ ++this.count;
+ if (this.slots * 2 > this.keys.length) {
+ this.rehash();
+ }
+ }
+
+ public void remove(SetOfLong keys) {
+ keys.DEFAULT_ITERATOR.init();
+
+ while(keys.DEFAULT_ITERATOR.hasMoreElements()) {
+ this.remove(keys.DEFAULT_ITERATOR.nextKey());
+ }
+ }
+
+ public void remove(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ this.keys[index] = Long.MIN_VALUE;
+ --this.count;
+ }
+
+ public boolean contains(long key) {
+ if (key == 0L) {
+ key = Long.MAX_VALUE;
+ }
+
+ int index = (int)((key & Long.MAX_VALUE) % (long)this.keys.length);
+ int step = (int)((key & Long.MAX_VALUE) % ((long)this.keys.length - 2L)) + 1;
+
+ for(long curKey = this.keys[index]; curKey != key; curKey = this.keys[index]) {
+ if (curKey == 0L) {
+ return false;
+ }
+
+ index = (index + step) % this.keys.length;
+ }
+
+ return true;
+ }
+
+ public boolean empty() {
+ return this.count == 0;
+ }
+
+ private void rehash() {
+ long[] keys;
+ if (this.count * 2 > this.keys.length) {
+ ++this.sizeexp;
+ this.oldkeys = null;
+ keys = new long[SIZES[this.sizeexp]];
+ } else if (this.oldkeys != null && this.oldkeys.length == this.keys.length) {
+ keys = this.oldkeys;
+
+ Arrays.fill(keys, 0L);
+
+ this.oldkeys = this.keys;
+ } else {
+ this.oldkeys = this.keys;
+ keys = new long[SIZES[this.sizeexp]];
+ }
+
+ int slots = 0;
+
+ for (long key : this.keys) {
+ if (key != 0L && key != Long.MIN_VALUE) {
+ int index = (int) ((key & Long.MAX_VALUE) % (long) keys.length);
+ int step = (int) ((key & Long.MAX_VALUE) % ((long) keys.length - 2L)) + 1;
+
+ while (keys[index] != 0L) {
+ index = (index + step) % keys.length;
+ }
+
+ keys[index] = key;
+ ++slots;
+ }
+ }
+
+ this.keys = keys;
+ this.slots = slots;
+ }
+
+ public int size() {
+ return this.count;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof SetOfLong)) {
+ return false;
+ } else {
+ SetOfLong set = (SetOfLong)o;
+ if (set.size() != this.size()) {
+ return false;
+ } else {
+ for (long l : this.keys) {
+ long key = l;
+ if (key != 0L && key != Long.MIN_VALUE) {
+ if (key == Long.MAX_VALUE) {
+ key = 0L;
+ }
+
+ if (!set.contains(key)) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+ }
+
+ public class Iterator {
+ private int index = 0;
+ private long key;
+
+ private Iterator() {
+ }
+
+ public void init() {
+ this.index = 0;
+ }
+
+ public boolean hasMoreElements() {
+ while(this.index < SetOfLong.this.keys.length) {
+ this.key = SetOfLong.this.keys[this.index];
+ ++this.index;
+ if (this.key != 0L && this.key != Long.MIN_VALUE) {
+ if (this.key == Long.MAX_VALUE) {
+ this.key = 0L;
+ }
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public long nextKey() {
+ return this.key;
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreInputStream.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreInputStream.java
new file mode 100644
index 0000000..6642667
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreInputStream.java
@@ -0,0 +1,20 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.BufferedInputStream;
+import java.io.DataInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.zip.Inflater;
+import java.util.zip.InflaterInputStream;
+
+public class StoreInputStream extends DataInputStream {
+ public StoreInputStream(String file, Inflater inflater) throws IOException {
+ super(new BufferedInputStream(new InflaterInputStream(new FileInputStream(file), inflater)));
+ }
+
+ public void readIntArray(int[] array) throws IOException {
+ for(int i = 0; i < array.length; ++i) {
+ array[i] = this.readInt();
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreOutputStream.java b/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreOutputStream.java
new file mode 100644
index 0000000..a3bedfa
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/collections/StoreOutputStream.java
@@ -0,0 +1,20 @@
+package com.apkide.analysis.clm.api.collections;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.zip.Deflater;
+import java.util.zip.DeflaterOutputStream;
+
+public class StoreOutputStream extends DataOutputStream {
+ public StoreOutputStream(String file, Deflater deflater) throws IOException {
+ super(new BufferedOutputStream(new DeflaterOutputStream(new FileOutputStream(file), deflater)));
+ }
+
+ public void writeIntArray(int[] array) throws IOException {
+ for (int j : array) {
+ this.writeInt(j);
+ }
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/AmbiguousEntityException.java b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/AmbiguousEntityException.java
new file mode 100644
index 0000000..8f1c879
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/AmbiguousEntityException.java
@@ -0,0 +1,14 @@
+package com.apkide.analysis.clm.api.excpetions;
+
+import androidx.annotation.NonNull;
+
+public class AmbiguousEntityException extends Exception {
+ public AmbiguousEntityException() {
+ }
+
+ @NonNull
+ @Override
+ public Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/DuplicateEntityException.java b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/DuplicateEntityException.java
new file mode 100644
index 0000000..9cd605d
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/DuplicateEntityException.java
@@ -0,0 +1,14 @@
+package com.apkide.analysis.clm.api.excpetions;
+
+import androidx.annotation.NonNull;
+
+public class DuplicateEntityException extends Exception {
+ public DuplicateEntityException() {
+ }
+
+ @NonNull
+ @Override
+ public Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/FileNotSynchronizedException.java b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/FileNotSynchronizedException.java
new file mode 100644
index 0000000..cf83207
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/FileNotSynchronizedException.java
@@ -0,0 +1,7 @@
+package com.apkide.analysis.clm.api.excpetions;
+
+public class FileNotSynchronizedException extends RuntimeException {
+ public FileNotSynchronizedException(String s) {
+ super("File is not update " + s);
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/UnknownEntityException.java b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/UnknownEntityException.java
new file mode 100644
index 0000000..979ad89
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/excpetions/UnknownEntityException.java
@@ -0,0 +1,14 @@
+package com.apkide.analysis.clm.api.excpetions;
+
+import androidx.annotation.NonNull;
+
+public class UnknownEntityException extends Exception {
+ public UnknownEntityException() {
+ }
+
+ @NonNull
+ @Override
+ public Throwable fillInStackTrace() {
+ return this;
+ }
+}
diff --git a/cl/src/main/java/com/apkide/analysis/clm/api/util/TimeUtils.java b/cl/src/main/java/com/apkide/analysis/clm/api/util/TimeUtils.java
new file mode 100644
index 0000000..fefa91a
--- /dev/null
+++ b/cl/src/main/java/com/apkide/analysis/clm/api/util/TimeUtils.java
@@ -0,0 +1,32 @@
+package com.apkide.analysis.clm.api.util;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class TimeUtils {
+ private static final long INITIAL_TIME = System.currentTimeMillis();
+ private static final AtomicInteger timeDelta = new AtomicInteger(0);
+
+ TimeUtils() {
+ }
+
+ public static long currentTimeMillis() {
+ return INITIAL_TIME + ((long)timeDelta.get() & 4294967295L) * 100L;
+ }
+
+ static {
+ Thread th = new Thread("Time getter") {
+ @Override
+ public void run() {
+ try {
+ while(!this.isInterrupted()) {
+ TimeUtils.timeDelta.set((int)((System.currentTimeMillis() - TimeUtils.INITIAL_TIME) / 100L));
+ Thread.sleep(100L);
+ }
+ } catch (InterruptedException ignored) {
+ }
+ }
+ };
+ th.setPriority(1);
+ th.start();
+ }
+}
diff --git a/analysis-language/src/test/java/com/apkide/analysis/language/ExampleUnitTest.java b/cl/src/test/java/com/apkide/cl/ExampleUnitTest.java
similarity index 79%
rename from analysis-language/src/test/java/com/apkide/analysis/language/ExampleUnitTest.java
rename to cl/src/test/java/com/apkide/cl/ExampleUnitTest.java
index d419d43..afd7f33 100644
--- a/analysis-language/src/test/java/com/apkide/analysis/language/ExampleUnitTest.java
+++ b/cl/src/test/java/com/apkide/cl/ExampleUnitTest.java
@@ -1,9 +1,9 @@
-package com.apkide.analysis.language;
-
-import static org.junit.Assert.assertEquals;
+package com.apkide.cl;
import org.junit.Test;
+import static org.junit.Assert.*;
+
/**
* Example local unit test, which will execute on the development machine (host).
*
diff --git a/common/build.gradle b/common/build.gradle
index 0e2ba09..60a4715 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -48,5 +48,7 @@ dependencies {
api libs.tools.r8
api libs.dialogx
+ api 'com.thoughtworks.xstream:xstream:1.4.20'
+
testImplementation libs.junit
}
\ No newline at end of file
diff --git a/engine/build.gradle b/engine/build.gradle
index f21487d..38224d2 100644
--- a/engine/build.gradle
+++ b/engine/build.gradle
@@ -31,7 +31,6 @@ dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
coreLibraryDesugaring libs.desugar.jdk.libs.nio
implementation project(':common')
- implementation project(':analysis-api')
- implementation project(':analysis-language')
+ implementation project(':openapi')
testImplementation libs.junit
}
\ No newline at end of file
diff --git a/engine/src/main/java/com/apkide/engine/CodeModelProvider.java b/engine/src/main/java/com/apkide/engine/CodeModelProvider.java
deleted file mode 100644
index 6a3041e..0000000
--- a/engine/src/main/java/com/apkide/engine/CodeModelProvider.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.apkide.engine;
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.clm.Model;
-
-public interface CodeModelProvider {
- long getVersion();
-
- CodeModel[] createCodeModels(Model model);
-}
diff --git a/engine/src/main/java/com/apkide/engine/Engine.java b/engine/src/main/java/com/apkide/engine/Engine.java
deleted file mode 100644
index b5dfba5..0000000
--- a/engine/src/main/java/com/apkide/engine/Engine.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.apkide.engine;
-
-public final class Engine {
- private static final String TAG = "Engine";
-
- private final Object myLock = new Object();
- private boolean myShutdown;
-
- public Engine() {
-
- Thread thread = new Thread(null, () -> {
- while (!myShutdown) {
- try {
-
-
- myLock.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }, "Engine");
- thread.setPriority(Thread.MIN_PRIORITY + 1);
- thread.start();
- }
-
-
- public void shutdown() {
- myShutdown = true;
- }
-}
diff --git a/engine/src/main/java/com/apkide/engine/EngineSolution.java b/engine/src/main/java/com/apkide/engine/EngineSolution.java
deleted file mode 100644
index b0d4ee1..0000000
--- a/engine/src/main/java/com/apkide/engine/EngineSolution.java
+++ /dev/null
@@ -1,189 +0,0 @@
-package com.apkide.engine;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.apkide.analysis.api.clm.Model;
-
-import java.util.List;
-import java.util.TreeMap;
-
-public class EngineSolution {
-
- private List projects;
- private String encoding;
- private TreeMap> codeModels;
-
- public EngineSolution(List projects, String encoding, TreeMap> codeModels) {
- this.projects = projects;
- this.encoding = encoding;
- this.codeModels = codeModels;
- }
-
- public void setModel(Model model) {
-
- }
-
- public static class Project implements Parcelable {
- private String assembly;
- private String projectFilePath;
- private String rootNamespace;
- private List projectFiles;
- private List projectAssembles;
- private boolean checked;
- private String configuration;
- private String destinationPath;
- private String targetVersion;
- private boolean debugBuild;
- private boolean externallyBuild;
- private List defaultImports;
- private List definedSymbols;
- private List tagLibPaths;
-
- public Project(String assembly, String projectFilePath, String rootNamespace, List projectFiles, List projectAssembles, boolean checked, String configuration, String destinationPath, String targetVersion, boolean debugBuild, boolean externallyBuild, List defaultImports, List definedSymbols, List tagLibPaths) {
- this.assembly = assembly;
- this.projectFilePath = projectFilePath;
- this.rootNamespace = rootNamespace;
- this.projectFiles = projectFiles;
- this.projectAssembles = projectAssembles;
- this.checked = checked;
- this.configuration = configuration;
- this.destinationPath = destinationPath;
- this.targetVersion = targetVersion;
- this.debugBuild = debugBuild;
- this.externallyBuild = externallyBuild;
- this.defaultImports = defaultImports;
- this.definedSymbols = definedSymbols;
- this.tagLibPaths = tagLibPaths;
- }
-
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(this.assembly);
- dest.writeString(this.projectFilePath);
- dest.writeString(this.rootNamespace);
- dest.writeTypedList(this.projectFiles);
- dest.writeStringList(this.projectAssembles);
- dest.writeByte(this.checked ? (byte) 1 : (byte) 0);
- dest.writeString(this.configuration);
- dest.writeString(this.destinationPath);
- dest.writeString(this.targetVersion);
- dest.writeByte(this.debugBuild ? (byte) 1 : (byte) 0);
- dest.writeByte(this.externallyBuild ? (byte) 1 : (byte) 0);
- dest.writeStringList(this.defaultImports);
- dest.writeStringList(this.definedSymbols);
- dest.writeStringList(this.tagLibPaths);
- }
-
- public void readFromParcel(Parcel source) {
- this.assembly = source.readString();
- this.projectFilePath = source.readString();
- this.rootNamespace = source.readString();
- this.projectFiles = source.createTypedArrayList(File.CREATOR);
- this.projectAssembles = source.createStringArrayList();
- this.checked = source.readByte() != 0;
- this.configuration = source.readString();
- this.destinationPath = source.readString();
- this.targetVersion = source.readString();
- this.debugBuild = source.readByte() != 0;
- this.externallyBuild = source.readByte() != 0;
- this.defaultImports = source.createStringArrayList();
- this.definedSymbols = source.createStringArrayList();
- this.tagLibPaths = source.createStringArrayList();
- }
-
- protected Project(Parcel in) {
- this.assembly = in.readString();
- this.projectFilePath = in.readString();
- this.rootNamespace = in.readString();
- this.projectFiles = in.createTypedArrayList(File.CREATOR);
- this.projectAssembles = in.createStringArrayList();
- this.checked = in.readByte() != 0;
- this.configuration = in.readString();
- this.destinationPath = in.readString();
- this.targetVersion = in.readString();
- this.debugBuild = in.readByte() != 0;
- this.externallyBuild = in.readByte() != 0;
- this.defaultImports = in.createStringArrayList();
- this.definedSymbols = in.createStringArrayList();
- this.tagLibPaths = in.createStringArrayList();
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator<>() {
- @Override
- public Project createFromParcel(Parcel source) {
- return new Project(source);
- }
-
- @Override
- public Project[] newArray(int size) {
- return new Project[size];
- }
- };
- }
-
- public static class File implements Parcelable {
- private String filePath;
- private String language;
- private String packageName;
- private boolean isResource;
- private boolean isBinary;
-
- public File(String filePath, String language, String packageName, boolean isResource, boolean isBinary) {
- this.filePath = filePath;
- this.language = language;
- this.packageName = packageName;
- this.isResource = isResource;
- this.isBinary = isBinary;
- }
-
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(this.filePath);
- dest.writeString(this.language);
- dest.writeString(this.packageName);
- dest.writeByte(this.isResource ? (byte) 1 : (byte) 0);
- dest.writeByte(this.isBinary ? (byte) 1 : (byte) 0);
- }
-
- public void readFromParcel(Parcel source) {
- this.filePath = source.readString();
- this.language = source.readString();
- this.packageName = source.readString();
- this.isResource = source.readByte() != 0;
- this.isBinary = source.readByte() != 0;
- }
-
- protected File(Parcel in) {
- this.filePath = in.readString();
- this.language = in.readString();
- this.packageName = in.readString();
- this.isResource = in.readByte() != 0;
- this.isBinary = in.readByte() != 0;
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator<>() {
- @Override
- public File createFromParcel(Parcel source) {
- return new File(source);
- }
-
- @Override
- public File[] newArray(int size) {
- return new File[size];
- }
- };
- }
-}
diff --git a/engine/src/main/java/com/apkide/engine/FileHighlights.java b/engine/src/main/java/com/apkide/engine/FileHighlights.java
deleted file mode 100644
index 4cd6fe1..0000000
--- a/engine/src/main/java/com/apkide/engine/FileHighlights.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.apkide.engine;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class FileHighlights implements Parcelable {
-
- public String filePath;
- public int[] kinds;
- public int[] startLines;
- public int[] startColumns;
- public int[] endLines;
- public int[] endColumns;
- public int size;
- public FileHighlights(){}
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeString(this.filePath);
- dest.writeIntArray(this.kinds);
- dest.writeIntArray(this.startLines);
- dest.writeIntArray(this.startColumns);
- dest.writeIntArray(this.endLines);
- dest.writeIntArray(this.endColumns);
- dest.writeInt(this.size);
- }
-
- public void readFromParcel(Parcel source) {
- this.filePath = source.readString();
- this.kinds = source.createIntArray();
- this.startLines = source.createIntArray();
- this.startColumns = source.createIntArray();
- this.endLines = source.createIntArray();
- this.endColumns = source.createIntArray();
- this.size = source.readInt();
- }
-
- protected FileHighlights(Parcel in) {
- this.filePath = in.readString();
- this.kinds = in.createIntArray();
- this.startLines = in.createIntArray();
- this.startColumns = in.createIntArray();
- this.endLines = in.createIntArray();
- this.endColumns = in.createIntArray();
- this.size = in.readInt();
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator<>() {
- @Override
- public FileHighlights createFromParcel(Parcel source) {
- return new FileHighlights(source);
- }
-
- @Override
- public FileHighlights[] newArray(int size) {
- return new FileHighlights[size];
- }
- };
-}
diff --git a/engine/src/main/java/com/apkide/engine/FileReaderCallbackImpl.java b/engine/src/main/java/com/apkide/engine/FileReaderCallbackImpl.java
deleted file mode 100644
index b3d73ab..0000000
--- a/engine/src/main/java/com/apkide/engine/FileReaderCallbackImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.apkide.engine;
-
-import com.apkide.analysis.api.clm.callback.FileReaderCallback;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PushbackInputStream;
-import java.io.Reader;
-
-public class FileReaderCallbackImpl implements FileReaderCallback {
- @Override
- public Reader createBomReader(InputStream inStream, String fallbackEncoding) throws IOException {
- PushbackInputStream pbInputStream = new PushbackInputStream(inStream, 4);
- byte[] bomBytes = new byte[4];
-
- int totalCount;
- int count;
- for (totalCount = 0; totalCount < 4; totalCount += count) {
- count = pbInputStream.read(bomBytes, totalCount, 4 - totalCount);
- if (count == -1) {
- break;
- }
- }
-
- String encoding = null;
- if (totalCount == 4) {
- if ((bomBytes[0] & 255) == 0 && (bomBytes[1] & 255) == 0 && (bomBytes[2] & 255) == 254 && (bomBytes[3] & 255) == 255) {
- encoding = "UTF-32BE";
- } else if ((bomBytes[0] & 255) == 255 && (bomBytes[1] & 255) == 254 && (bomBytes[2] & 255) == 0 && (bomBytes[3] & 255) == 0) {
- encoding = "UTF-32LE";
- }
- }
-
- if (encoding == null && totalCount >= 3 && (bomBytes[0] & 255) == 239 && (bomBytes[1] & 255) == 187 && (bomBytes[2] & 255) == 191) {
- encoding = "UTF-8";
- pbInputStream.unread(bomBytes, 3, totalCount - 3);
- }
-
- if (encoding == null && totalCount >= 2) {
- if ((bomBytes[0] & 255) == 254 && (bomBytes[1] & 255) == 255) {
- encoding = "UTF-16BE";
- } else if ((bomBytes[0] & 255) == 255 && (bomBytes[1] & 255) == 254) {
- encoding = "UTF-16LE";
- pbInputStream.unread(bomBytes, 2, totalCount - 2);
- }
- }
-
- if (encoding == null) {
- pbInputStream.unread(bomBytes, 0, totalCount);
- }
-
- if (encoding == null) {
- return fallbackEncoding != null ? new InputStreamReader(pbInputStream, fallbackEncoding) : new InputStreamReader(pbInputStream);
- } else {
- return new InputStreamReader(pbInputStream, encoding);
- }
- }
-}
diff --git a/engine/src/main/java/com/apkide/engine/SyntaxKind.java b/engine/src/main/java/com/apkide/engine/SyntaxKind.java
deleted file mode 100644
index 2b6db41..0000000
--- a/engine/src/main/java/com/apkide/engine/SyntaxKind.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.apkide.engine;
-
-public enum SyntaxKind {
- Plain,
- Keyword,
- Operator,
- Separator,
- StringLiteral,
- NumberLiteral,
- Metadata,
- Identifier,
- NamespaceIdentifier,
- ClassIdentifier,
- TypeIdentifier,
- VariableIdentifier,
- FunctionIdentifier,
- ParameterIdentifier,
- Comment,
- DocumentationComment;
-
-
- public int intValue() {
- return ordinal();
- }
-
- public static SyntaxKind of(int kind) {
- if (kind < 0 || kind > DocumentationComment.intValue())
- return Plain;
- return values()[kind];
- }
-}
diff --git a/engine/src/main/java/com/apkide/engine/service/CodeAnalysisService.java b/engine/src/main/java/com/apkide/engine/service/CodeAnalysisService.java
deleted file mode 100644
index a80f88e..0000000
--- a/engine/src/main/java/com/apkide/engine/service/CodeAnalysisService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.apkide.engine.service;
-
-import android.app.Service;
-import android.content.Intent;
-import android.os.IBinder;
-
-import androidx.annotation.Nullable;
-
-public class CodeAnalysisService extends Service {
- @Nullable
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
-}
diff --git a/engine/src/main/java/com/apkide/engine/service/CodeModels.java b/engine/src/main/java/com/apkide/engine/service/CodeModels.java
deleted file mode 100644
index 25ab424..0000000
--- a/engine/src/main/java/com/apkide/engine/service/CodeModels.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.apkide.engine.service;
-
-import com.apkide.analysis.api.cle.CodeModel;
-import com.apkide.analysis.api.clm.Model;
-import com.apkide.analysis.api.clm.common.FileNamePatternMatcher;
-import com.apkide.analysis.language.cpp.CppCodeModel;
-import com.apkide.common.FileUtils;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.TreeMap;
-
-public class CodeModels {
-
- public static CodeModel[] getCodeModels() {
- return createCodeModels(null);
- }
-
- public static TreeMap> getFilePatternMap() {
- TreeMap> map = new TreeMap<>();
- for (CodeModel codeModel : getCodeModels()) {
- map.put(codeModel.getName(), Arrays.asList(codeModel.getDefaultFilePatterns()));
- }
- return map;
- }
-
- public static CodeModel getCodeModel(String filePath) {
- String fileName = FileUtils.getFileName(filePath);
- for (CodeModel codeModel : getCodeModels()) {
- for (String pattern : codeModel.getDefaultFilePatterns()) {
- if (FileNamePatternMatcher.get() != null && FileNamePatternMatcher.get().match(fileName, pattern)) {
- return codeModel;
- }
- }
- }
- return null;
- }
-
- public static CodeModel[] createCodeModels(Model model) {
- return new CodeModel[]{
- new CppCodeModel(model)
- };
- }
-}
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 154be1e..d6bd90b 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -35,8 +35,6 @@ com-android-tools-smali-smali-util = { module = "com.android.tools.smali:smali-u
com-android-tools-smali-smali-baksmali = { module = "com.android.tools.smali:smali-baksmali", version.ref = "com-android-tools-smali-smali-baksmali" }
com-google-guava-guava = { module = "com.google.guava:guava", version.ref = "com-google-guava-guava" }
dialogx = { module = "com.kongzue.dialogx:DialogX", version.ref = "dialogx" }
-editor = { module = "io.github.Rosemoe.sora-editor:editor", version.ref = "editor" }
-lsp4j-org-eclipse-lsp4j = { module = "org.eclipse.lsp4j:org.eclipse.lsp4j", version.ref = "eclipse-org-eclipse-lsp4j" }
material = { module = "com.google.android.material:material", version.ref = "material" }
gradle = { module = "com.android.tools.build:gradle", version.ref = "gradle" }
desugar_jdk_libs_nio = { module = "com.android.tools:desugar_jdk_libs_nio", version.ref = "desugar_jdk_libs_nio" }
diff --git a/analysis-language/.gitignore b/openapi/.gitignore
similarity index 100%
rename from analysis-language/.gitignore
rename to openapi/.gitignore
diff --git a/analysis-api/build.gradle b/openapi/build.gradle
similarity index 91%
rename from analysis-api/build.gradle
rename to openapi/build.gradle
index e5162cb..8ca272b 100644
--- a/analysis-api/build.gradle
+++ b/openapi/build.gradle
@@ -3,7 +3,7 @@ plugins {
}
android {
- namespace 'com.apkide.analysis.api'
+ namespace 'com.apkide.openapi'
compileSdk 33
defaultConfig {
@@ -29,5 +29,6 @@ dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
coreLibraryDesugaring libs.desugar.jdk.libs.nio
implementation project(':common')
+ api libs.antlr4.runtime
testImplementation libs.junit
}
\ No newline at end of file
diff --git a/analysis-language/consumer-rules.pro b/openapi/consumer-rules.pro
similarity index 100%
rename from analysis-language/consumer-rules.pro
rename to openapi/consumer-rules.pro
diff --git a/analysis-language/proguard-rules.pro b/openapi/proguard-rules.pro
similarity index 100%
rename from analysis-language/proguard-rules.pro
rename to openapi/proguard-rules.pro
diff --git a/analysis-language/src/main/AndroidManifest.xml b/openapi/src/main/AndroidManifest.xml
similarity index 100%
rename from analysis-language/src/main/AndroidManifest.xml
rename to openapi/src/main/AndroidManifest.xml
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Analyzer.java b/openapi/src/main/java/com/apkide/openapi/language/Analyzer.java
new file mode 100644
index 0000000..eb6fc71
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Analyzer.java
@@ -0,0 +1,14 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.SyntaxTree;
+
+public interface Analyzer {
+
+
+
+ void analyzeErrors(@NonNull FileEntry file, @NonNull SyntaxTree ast);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Compiler.java b/openapi/src/main/java/com/apkide/openapi/language/Compiler.java
new file mode 100644
index 0000000..ec35d31
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Compiler.java
@@ -0,0 +1,11 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.SyntaxTree;
+
+public interface Compiler {
+ void compile(@NonNull FileEntry file, @NonNull SyntaxTree syntaxTree);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Formatter.java b/openapi/src/main/java/com/apkide/openapi/language/Formatter.java
new file mode 100644
index 0000000..100787f
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Formatter.java
@@ -0,0 +1,109 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+
+import java.io.Reader;
+import java.util.List;
+import java.util.Set;
+
+public interface Formatter {
+ @NonNull
+ List extends FormatterOption> getAllOptions();
+
+ @NonNull
+ Set getDefaultOptions();
+
+ void setOptions(@NonNull Set options);
+
+ @NonNull
+ Set getOptions();
+
+ void outCommentLines(@NonNull FormatterCallback callback, int startLine, int endLine);
+
+ void unOutCommentLines(@NonNull FormatterCallback callback, int startLine, int endLine);
+
+ void expandSelection(@NonNull FormatterCallback callback, int startLine, int startColumn, int endLine, int endColumn);
+
+ void expandSelectionToStatements(@NonNull FormatterCallback callback, int startLine, int startColumn, int endLine, int endColumn);
+
+ void learnStyle(@NonNull FormatterCallback callback, @NonNull Set options);
+
+ void autoIndentAfterPaste(@NonNull FormatterCallback callback, int startLine, int endLine);
+
+ void autoFormatLines(@NonNull FormatterCallback callback, int startLine, int endLine);
+
+ void autoIndentLines(@NonNull FormatterCallback callback, int startLine, int endLine);
+
+ void autoIndentLine(@NonNull FormatterCallback callback, int line);
+
+ void indentAfterLineBreak(@NonNull FormatterCallback callback, int line, int column);
+
+ void indentAfterCharEvent(@NonNull FormatterCallback callback, int line, int column, char c);
+
+ interface FormatterOption {
+
+ @NonNull
+ String getGroup();
+
+ @NonNull
+ String getName();
+
+ @NonNull
+ String getPreview(boolean preview);
+
+ }
+
+ interface FormatterCallback {
+
+ void setCaretPosition(int line, int column);
+
+ int getCaretLine();
+
+ int getCaretColumn();
+
+ void select(int startLine, int startColumn, int endLine, int endColumn);
+
+ @NonNull
+ Reader getReader();
+
+ char getChar(int line, int column);
+
+ int getLineCount();
+
+ int getLineLength(int line);
+
+ int getStyle(int line, int column);
+
+ void setIndentationSize(int indentationSize);
+
+ int getIndentationSize();
+
+ void setTabSize(int tabSize);
+
+ int getTabSize();
+
+ void setLineMaxColumn(int maxColumn);
+
+ int getLineMaxColumn();
+
+ int getIndentation(int line);
+
+ void indentationLine(int line, int indentationSize);
+
+ void insertLineBreak(int line, int column);
+
+ void removeLineBreak(int line);
+
+ void removeLineBreak(int startLine, int startColumn, int endLine, int endColumn);
+
+ void insertSpace(int line, int column);
+
+ void removeSpace(int startLine, int startColumn, int endLine, int endColumn);
+
+ void insertChar(int line, int column, char c);
+
+ void insertChars(int line, int column, char[] chars);
+
+ void removeChars(int startLine, int startColumn, int endLine, int endColumn);
+ }
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Language.java b/openapi/src/main/java/com/apkide/openapi/language/Language.java
new file mode 100644
index 0000000..d05f416
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Language.java
@@ -0,0 +1,55 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.apkide.openapi.language.api.FileEntry;
+import com.apkide.openapi.language.api.Highlights;
+
+import org.antlr.v4.runtime.tree.SyntaxTree;
+
+import java.io.IOException;
+import java.io.Reader;
+
+public interface Language {
+
+ @NonNull
+ String getName();
+
+ @NonNull
+ String[] getDefaultFilePatterns();
+
+ @Nullable
+ Formatter getFormatter();
+
+ @Nullable
+ Syntax getSyntax();
+
+ @Nullable
+ Lexer getLexer();
+
+ @Nullable
+ Parser getParser();
+
+ @Nullable
+ Analyzer getAnalyzer();
+
+ @Nullable
+ Renderer getRenderer();
+
+ boolean isArchiveFileSupported();
+
+ @Nullable
+ String[] getArchiveEntries(@NonNull String filePath) throws IOException;
+
+ @NonNull
+ Reader getArchiveEntryReader(@NonNull String filePath, @NonNull String entryPath, @NonNull String encoding) throws IOException;
+
+ long getArchiveVersion(@NonNull String filePath);
+
+ void closeArchiveFile();
+
+ void fileHighlighting(@NonNull FileEntry file, @NonNull Reader reader, @NonNull Highlights highlights);
+
+ void createSyntaxTree(@NonNull FileEntry file, @NonNull Reader reader, @NonNull SyntaxTree[] syntaxTrees, boolean checkErrors);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Lexer.java b/openapi/src/main/java/com/apkide/openapi/language/Lexer.java
new file mode 100644
index 0000000..ae54145
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Lexer.java
@@ -0,0 +1,5 @@
+package com.apkide.openapi.language;
+
+public interface Lexer {
+
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Parser.java b/openapi/src/main/java/com/apkide/openapi/language/Parser.java
new file mode 100644
index 0000000..4e5e7aa
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Parser.java
@@ -0,0 +1,4 @@
+package com.apkide.openapi.language;
+
+public interface Parser {
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Renderer.java b/openapi/src/main/java/com/apkide/openapi/language/Renderer.java
new file mode 100644
index 0000000..9e32e8a
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Renderer.java
@@ -0,0 +1,14 @@
+package com.apkide.openapi.language;
+
+
+import androidx.annotation.NonNull;
+
+import org.antlr.v4.runtime.tree.SyntaxTree;
+
+public interface Renderer {
+
+
+
+ @NonNull
+ String getName(@NonNull SyntaxTree element);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/SignatureAnalyzer.java b/openapi/src/main/java/com/apkide/openapi/language/SignatureAnalyzer.java
new file mode 100644
index 0000000..45d199a
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/SignatureAnalyzer.java
@@ -0,0 +1,4 @@
+package com.apkide.openapi.language;
+
+public interface SignatureAnalyzer {
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Syntax.java b/openapi/src/main/java/com/apkide/openapi/language/Syntax.java
new file mode 100644
index 0000000..8b7bd07
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Syntax.java
@@ -0,0 +1,36 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+
+public interface Syntax {
+ boolean isParameters(int token);
+
+ boolean isMethodDeclaration(int token);
+
+ boolean isFieldDeclaration(int token);
+
+ boolean isArguments(int token);
+
+ boolean isClassBody(int token);
+
+ boolean isBlock(int token);
+
+ boolean isIdentifier(int token);
+
+ boolean isExpression(int token);
+
+ boolean isStatement(int token);
+
+ boolean isMemberDeclaration(int token);
+
+ boolean isClassDeclaration(int token);
+
+ boolean isLiteral(int token);
+
+ boolean isToken(int token);
+
+ @NonNull
+ String getString(int token);
+
+ int getLength(int token);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/Tools.java b/openapi/src/main/java/com/apkide/openapi/language/Tools.java
new file mode 100644
index 0000000..d2b50c5
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/Tools.java
@@ -0,0 +1,50 @@
+package com.apkide.openapi.language;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.SyntaxTree;
+
+public interface Tools {
+
+ boolean isHighlighted();
+
+ void requestCompletionList(@NonNull FileEntry file, int line, int column);
+
+ void requestClassesCompletionList(@NonNull FileEntry file);
+
+ void requestSuperMethodsCompletionList(@NonNull FileEntry file, int line, int column);
+
+ void documentation(@NonNull FileEntry file);
+
+ void documentation(@NonNull FileEntry file, int line, int column);
+
+ void safeDelete(@NonNull FileEntry file, @NonNull SyntaxTree element);
+
+ void surroundWithTryCatch(FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void addThrows(@NonNull FileEntry file, int line, int column);
+
+ void createVariable(@NonNull FileEntry file, int line, int column, int identifier, @NonNull ParseTree type);
+
+ void createField(@NonNull FileEntry file, int line, int column, int modifiers, int identifier, @NonNull ParseTree type);
+
+ void createMethod(@NonNull FileEntry file, int line, int column, int modifiers, int identifier, @NonNull ParseTree type, int[] argModifiers, @NonNull ParseTree[] argTypes, int[] argNames);
+
+ void inlineVariable(@NonNull FileEntry file, int line, int column);
+
+ void createSettersAndGetters(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void createConstructor(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void extractMethod(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void implementMembers(@NonNull FileEntry file, int line, int column);
+
+ void overrideMember(@NonNull FileEntry file, int line, int column, @NonNull ParseTree member);
+
+ void introduceVariable(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/FileEntry.java b/openapi/src/main/java/com/apkide/openapi/language/api/FileEntry.java
new file mode 100644
index 0000000..217fd0f
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/FileEntry.java
@@ -0,0 +1,5 @@
+package com.apkide.openapi.language.api;
+
+public class FileEntry {
+
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/FileSpace.java b/openapi/src/main/java/com/apkide/openapi/language/api/FileSpace.java
new file mode 100644
index 0000000..28202e9
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/FileSpace.java
@@ -0,0 +1,4 @@
+package com.apkide.openapi.language.api;
+
+public class FileSpace {
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/Highlights.java b/openapi/src/main/java/com/apkide/openapi/language/api/Highlights.java
new file mode 100644
index 0000000..06caa5b
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/Highlights.java
@@ -0,0 +1,4 @@
+package com.apkide.openapi.language.api;
+
+public class Highlights {
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/Model.java b/openapi/src/main/java/com/apkide/openapi/language/api/Model.java
new file mode 100644
index 0000000..85b4393
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/Model.java
@@ -0,0 +1,6 @@
+package com.apkide.openapi.language.api;
+
+public class Model {
+
+
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/CodeCompleterCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/CodeCompleterCallback.java
new file mode 100644
index 0000000..f4ecc24
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/CodeCompleterCallback.java
@@ -0,0 +1,26 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+
+public interface CodeCompleterCallback {
+
+ void fileStarted(@NonNull FileEntry file);
+
+ void listStarted();
+
+ void listElementUnknownIdentifierFound(@NonNull FileEntry file,@NonNull String identifier);
+
+ void listElementKeywordFound(@NonNull FileEntry file, @NonNull String keyword);
+
+ void listElementFound(@NonNull FileEntry file, @NonNull ParseTree element);
+
+ void listElementFound(@NonNull FileEntry file, @NonNull ParseTree element, boolean enclosing);
+
+ void listCompleted(@NonNull FileEntry file, int line, int column);
+
+ void fileFinished(@NonNull FileEntry file);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/HighlighterCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/HighlighterCallback.java
new file mode 100644
index 0000000..db17393
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/HighlighterCallback.java
@@ -0,0 +1,38 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.Language;
+import com.apkide.openapi.language.api.FileEntry;
+import com.apkide.openapi.language.api.Highlights;
+
+public interface HighlighterCallback {
+
+ void fileStarted(@NonNull FileEntry file);
+
+ void fileHighlightingFinished(@NonNull FileEntry file, @NonNull Language language, @NonNull Highlights highlights);
+
+ void keywordFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void packageFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void fieldFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void variableFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void functionFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void functionCallFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void parameterFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void identifierFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void constructorFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void typeFound(@NonNull FileEntry file, @NonNull Language language, int startLine, int startColumn, int endLine, int endColumn);
+
+ void semanticHighlightingFinished(@NonNull FileEntry file);
+
+ void fileFinished(@NonNull FileEntry file);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/OpenFileCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/OpenFileCallback.java
new file mode 100644
index 0000000..65745ba
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/OpenFileCallback.java
@@ -0,0 +1,21 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import java.io.Reader;
+
+public interface OpenFileCallback {
+
+ @NonNull
+ Reader getOpenFileReader(@NonNull FileEntry file);
+
+ long getOpenFileVersion(@NonNull FileEntry file);
+
+ long getOpenFileSize(@NonNull FileEntry file);
+
+ boolean isOpenFile(@NonNull FileEntry file);
+
+ void update();
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/RefactorCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/RefactorCallback.java
new file mode 100644
index 0000000..99e3f49
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/RefactorCallback.java
@@ -0,0 +1,80 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+public interface RefactorCallback {
+
+ void pasteText(@NonNull FileEntry file, int line, int column);
+
+ void cutText(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void replaceText(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn, @NonNull String newText);
+
+ void moveText(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
+
+ void copyText(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn, int line, int column);
+
+ void selectText(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void indentLines(@NonNull FileEntry file, int startLine, int endLine);
+
+ void renameFile(@NonNull FileEntry file, @NonNull String name);
+
+ void moveFile(@NonNull FileEntry file, @NonNull FileEntry newFile);
+
+ void deleteFile(@NonNull FileEntry file);
+
+ void reportUnSupportedOfRefactoring(@NonNull FileEntry file);
+
+ void reportWarning(@NonNull FileEntry file, @NonNull String msg);
+
+ void analysisStarted(@NonNull FileEntry file);
+
+ void renameAnalysisFinished(@NonNull FileEntry file);
+
+ void reportRenameProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void moveAnalysisFinished(@NonNull FileEntry file);
+
+ void reportMoveProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void fixAnalysisFinished(@NonNull FileEntry file);
+
+ void reportFixProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void documentationAnalysisFinished(@NonNull FileEntry file);
+
+ void reportDocumentationProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void createAnalysisFinished(@NonNull FileEntry file);
+
+ void reportCreateProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void implementationAnalysisFinished(@NonNull FileEntry file);
+
+ void reportImplementationProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void introduceAnalysisFinished(@NonNull FileEntry file);
+
+ void reportIntroduceProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void extractAnalysisFinished(@NonNull FileEntry file);
+
+ void reportExtractProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void inlineVariableAnalysisFinished(@NonNull FileEntry file);
+
+ void reportInlineVariableProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void optimizeImportAnalysisFinished(@NonNull FileEntry file);
+
+ void reportOptimizeImportProblem(@NonNull FileEntry file, @NonNull String msg);
+
+ void surroundAnalysisFinished(@NonNull FileEntry file);
+
+ void reportSurroundProblem(@NonNull FileEntry file, @NonNull String msg);
+
+
+}
diff --git a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StopCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/StopCallback.java
similarity index 67%
rename from analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StopCallback.java
rename to openapi/src/main/java/com/apkide/openapi/language/api/callback/StopCallback.java
index eb64be2..c74c303 100644
--- a/analysis-api/src/main/java/com/apkide/analysis/api/clm/callback/StopCallback.java
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/StopCallback.java
@@ -1,16 +1,12 @@
-package com.apkide.analysis.api.clm.callback;
+package com.apkide.openapi.language.api.callback;
public interface StopCallback {
boolean stopSearchSymbols();
- boolean stopNamespacesLoad();
+ boolean stopUsageSearch();
boolean stopRefactoring();
- boolean stopMetrics();
-
- boolean stopUsageSearch();
-
boolean stopCheckInFile();
boolean stopCheck();
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/StructureCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/StructureCallback.java
new file mode 100644
index 0000000..c61b765
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/StructureCallback.java
@@ -0,0 +1,35 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+
+public interface StructureCallback {
+ void fileStarted(@NonNull FileEntry file);
+
+ void elementFound(@NonNull FileEntry file,
+ @NonNull ParseTree element,
+ int identifierLine,
+ int identifierStartColumn,
+ int identifierEndColumn,
+ int startLine,
+ int startColumn,
+ int endLine,
+ int endColumn,
+ int node);
+
+ void elementFound(@NonNull FileEntry file,
+ @NonNull ParseTree element,
+ int identifierLine,
+ int identifierStartColumn,
+ int identifierEndColumn,
+ int startLine,
+ int startColumn,
+ int endLine,
+ int endColumn
+ );
+
+ void fileFinished(@NonNull FileEntry file);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/SymbolSearcherCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/SymbolSearcherCallback.java
new file mode 100644
index 0000000..266e03d
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/SymbolSearcherCallback.java
@@ -0,0 +1,15 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+
+public interface SymbolSearcherCallback {
+ void fileStarted(@NonNull FileEntry file);
+
+ void elementFound(@NonNull FileEntry file, @NonNull ParseTree element);
+
+ void fileFinished(@NonNull FileEntry file);
+}
diff --git a/openapi/src/main/java/com/apkide/openapi/language/api/callback/UsageSearcherCallback.java b/openapi/src/main/java/com/apkide/openapi/language/api/callback/UsageSearcherCallback.java
new file mode 100644
index 0000000..bfa826c
--- /dev/null
+++ b/openapi/src/main/java/com/apkide/openapi/language/api/callback/UsageSearcherCallback.java
@@ -0,0 +1,13 @@
+package com.apkide.openapi.language.api.callback;
+
+import androidx.annotation.NonNull;
+
+import com.apkide.openapi.language.api.FileEntry;
+
+public interface UsageSearcherCallback {
+ void searchStarted(@NonNull FileEntry file);
+
+ void usageFound(@NonNull FileEntry file, int startLine, int startColumn, int endLine, int endColumn);
+
+ void searchFinished(@NonNull FileEntry file);
+}
diff --git a/analysis-api/src/test/java/com/apkide/analysis/api/ExampleUnitTest.java b/openapi/src/test/java/com/apkide/openapi/ExampleUnitTest.java
similarity index 91%
rename from analysis-api/src/test/java/com/apkide/analysis/api/ExampleUnitTest.java
rename to openapi/src/test/java/com/apkide/openapi/ExampleUnitTest.java
index d8cc279..64a6596 100644
--- a/analysis-api/src/test/java/com/apkide/analysis/api/ExampleUnitTest.java
+++ b/openapi/src/test/java/com/apkide/openapi/ExampleUnitTest.java
@@ -1,4 +1,4 @@
-package com.apkide.analysis.api;
+package com.apkide.openapi;
import static org.junit.Assert.assertEquals;
diff --git a/settings.gradle b/settings.gradle
index 3ee77d1..d35c60a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -6,6 +6,5 @@ include ':apktool:androlib'
include ':apktool:common'
include ':apktool:directory'
include ':apktool:util'
-include ':analysis-api'
include ':engine'
-include ':analysis-language'
+include ':openapi'