logic: fix update of Java indexer to new version of Java dependencies
* reapplied previous reverts * added cache for TypeSolvers in Java code
This commit is contained in:
@@ -673,7 +673,7 @@
|
||||
<Directory Id='DataJava' Name='java'>
|
||||
|
||||
<Component Id='JavaGuavaJar' Guid='*' Win64="$(var.Win64)">
|
||||
<File Id='JavaGuava' Name='guava-18.0.jar' DiskId='1' Source='./../../../bin/app/data/java/guava-18.0.jar' KeyPath='yes' />
|
||||
<File Id='JavaGuava' Name='guava-21.0.jar' DiskId='1' Source='./../../../bin/app/data/java/guava-21.0.jar' KeyPath='yes' />
|
||||
</Component>
|
||||
<Component Id='JavaJavaIndexerJar' Guid='*' Win64="$(var.Win64)">
|
||||
<File Id='JavaJavaIndexer' Name='java-indexer.jar' DiskId='1' Source='./../../../bin/app/data/java/java-indexer.jar' KeyPath='yes' />
|
||||
|
||||
@@ -4,6 +4,8 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.lang.String;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.github.javaparser.ast.CompilationUnit;
|
||||
@@ -14,6 +16,7 @@ import com.github.javaparser.Problem;
|
||||
import com.github.javaparser.Range;
|
||||
import com.github.javaparser.symbolsolver.javaparser.Navigator;
|
||||
import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade;
|
||||
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver;
|
||||
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
|
||||
@@ -21,41 +24,58 @@ import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeS
|
||||
|
||||
public class JavaIndexer
|
||||
{
|
||||
|
||||
private static Map<String, TypeSolver> typeSolvers = new HashMap<>();
|
||||
|
||||
public static void processFile(int address, String filePath, String fileContent, String classPath, int verbose)
|
||||
{
|
||||
logInfo(address, "indexing source file: " + filePath);
|
||||
|
||||
try
|
||||
{
|
||||
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
|
||||
CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver();
|
||||
|
||||
typeSolver.add(new ReflectionTypeSolver());
|
||||
combinedTypeSolver.add(new ReflectionTypeSolver());
|
||||
for (String path: classPath.split("\\;"))
|
||||
{
|
||||
if (path.endsWith(".jar"))
|
||||
if (typeSolvers.containsKey(path))
|
||||
{
|
||||
try
|
||||
{
|
||||
JarTypeSolver solver = new JarTypeSolver(path);
|
||||
typeSolver.add(solver);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("unable to add jar file: " + path);
|
||||
}
|
||||
combinedTypeSolver.add(typeSolvers.get(path));
|
||||
}
|
||||
else if (!path.isEmpty())
|
||||
else
|
||||
{
|
||||
JavaParserTypeSolver solver = new JavaParserTypeSolver(new File(path));
|
||||
typeSolver.add(solver);
|
||||
TypeSolver typeSolver = null;
|
||||
|
||||
if (path.endsWith(".jar"))
|
||||
{
|
||||
try
|
||||
{
|
||||
typeSolver = new JarTypeSolver(path);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
System.out.println("unable to add jar file: " + path);
|
||||
}
|
||||
}
|
||||
else if (!path.isEmpty())
|
||||
{
|
||||
typeSolver = new JavaParserTypeSolver(new File(path));
|
||||
}
|
||||
|
||||
if (typeSolver != null)
|
||||
{
|
||||
typeSolvers.put(path, typeSolver);
|
||||
combinedTypeSolver.add(typeSolver);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CompilationUnit cu = JavaParser.parse(new StringReader(fileContent));
|
||||
|
||||
JavaAstVisitor astVisitor = (
|
||||
verbose == 1 ?
|
||||
new JavaVerboseAstVisitor(address, filePath, new FileContent(fileContent), typeSolver) :
|
||||
new JavaAstVisitor(address, filePath, new FileContent(fileContent), typeSolver)
|
||||
new JavaVerboseAstVisitor(address, filePath, new FileContent(fileContent), combinedTypeSolver) :
|
||||
new JavaAstVisitor(address, filePath, new FileContent(fileContent), combinedTypeSolver)
|
||||
);
|
||||
|
||||
cu.accept(astVisitor, null);
|
||||
@@ -95,8 +115,6 @@ public class JavaIndexer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JavaParserFacade.clearInstances();
|
||||
}
|
||||
|
||||
public static String getPackageName(String fileContent)
|
||||
@@ -123,6 +141,13 @@ public class JavaIndexer
|
||||
return packageName;
|
||||
}
|
||||
|
||||
public static void clearCaches()
|
||||
{
|
||||
typeSolvers.clear();
|
||||
JavaParserFacade.clearInstances();
|
||||
Runtime.getRuntime().gc();
|
||||
}
|
||||
|
||||
// helpers
|
||||
|
||||
static public void recordSymbol(
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,8 @@
|
||||
#ifndef UNDO_REDO_VIEW_H
|
||||
#define UNDO_REDO_VIEW_H
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "component/view/View.h"
|
||||
#include <vector>
|
||||
|
||||
|
||||
@@ -4,11 +4,10 @@
|
||||
#include <memory>
|
||||
|
||||
#include "data/indexer/IndexerBase.h"
|
||||
#include "data/parser/ParserClientImpl.h"
|
||||
#include "utility/file/FileRegister.h"
|
||||
#include "data/indexer/IndexerCommand.h"
|
||||
#include "utility/logging/logging.h"
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
template <typename IndexerCommandType>
|
||||
class Indexer
|
||||
: public IndexerBase
|
||||
{
|
||||
@@ -20,21 +19,25 @@ public:
|
||||
virtual std::shared_ptr<IntermediateStorage> index(
|
||||
std::shared_ptr<IndexerCommand> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister);
|
||||
|
||||
virtual std::shared_ptr<IntermediateStorage> doIndex(
|
||||
std::shared_ptr<IndexerCommandType> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister) = 0;
|
||||
};
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
Indexer<IndexerCommandType, ParserType>::~Indexer()
|
||||
template <typename IndexerCommandType>
|
||||
Indexer<IndexerCommandType>::~Indexer()
|
||||
{
|
||||
}
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
std::string Indexer<IndexerCommandType, ParserType>::getKindString() const
|
||||
template <typename IndexerCommandType>
|
||||
std::string Indexer<IndexerCommandType>::getKindString() const
|
||||
{
|
||||
return IndexerCommandType::getIndexerKindString();
|
||||
}
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
std::shared_ptr<IntermediateStorage> Indexer<IndexerCommandType, ParserType>::index(
|
||||
template <typename IndexerCommandType>
|
||||
std::shared_ptr<IntermediateStorage> Indexer<IndexerCommandType>::index(
|
||||
std::shared_ptr<IndexerCommand> indexerCommand, std::shared_ptr<FileRegister> fileRegister)
|
||||
{
|
||||
std::shared_ptr<IndexerCommandType> castedCommand = std::dynamic_pointer_cast<IndexerCommandType>(indexerCommand);
|
||||
@@ -46,33 +49,7 @@ std::shared_ptr<IntermediateStorage> Indexer<IndexerCommandType, ParserType>::in
|
||||
return std::shared_ptr<IntermediateStorage>();
|
||||
}
|
||||
|
||||
std::shared_ptr<ParserClientImpl> parserClient = std::make_shared<ParserClientImpl>();
|
||||
|
||||
std::shared_ptr<ParserType> parser = std::make_shared<ParserType>(parserClient, fileRegister);
|
||||
|
||||
std::shared_ptr<IntermediateStorage> storage = std::make_shared<IntermediateStorage>();
|
||||
parserClient->setStorage(storage);
|
||||
|
||||
parser->buildIndex(castedCommand);
|
||||
|
||||
parserClient->resetStorage();
|
||||
|
||||
if (parserClient->hasFatalErrors() || indexerCommand->preprocessorOnly())
|
||||
{
|
||||
storage->setAllFilesIncomplete();
|
||||
}
|
||||
else
|
||||
{
|
||||
storage->setFilesWithErrorsIncomplete();
|
||||
fileRegister->markIndexingFilesIndexed();
|
||||
}
|
||||
|
||||
if (interrupted())
|
||||
{
|
||||
return std::shared_ptr<IntermediateStorage>();
|
||||
}
|
||||
|
||||
return storage;
|
||||
return doIndex(castedCommand, fileRegister);
|
||||
}
|
||||
|
||||
#endif // INDEXER_H
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
#define INDEXER_BASE_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "data/indexer/IndexerCommand.h"
|
||||
#include "data/IntermediateStorage.h"
|
||||
#include <string>
|
||||
|
||||
class FileRegister;
|
||||
class IndexerCommand;
|
||||
class IntermediateStorage;
|
||||
|
||||
class IndexerBase
|
||||
{
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#include "data/indexer/IndexerComposite.h"
|
||||
|
||||
#include "data/indexer/IndexerCommand.h"
|
||||
#include "utility/logging/logging.h"
|
||||
#include "data/IntermediateStorage.h"
|
||||
|
||||
IndexerComposite::~IndexerComposite()
|
||||
{
|
||||
|
||||
@@ -8,6 +8,7 @@ add_files(
|
||||
data/indexer/IndexerCommandCxxCdb.h
|
||||
data/indexer/IndexerCommandCxxManual.cpp
|
||||
data/indexer/IndexerCommandCxxManual.h
|
||||
data/indexer/IndexerCxx.h
|
||||
data/indexer/IndexerFactoryModuleCxxCdb.cpp
|
||||
data/indexer/IndexerFactoryModuleCxxCdb.h
|
||||
data/indexer/IndexerFactoryModuleCxxManual.cpp
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
#ifndef INDEXER_CXX_H
|
||||
#define INDEXER_CXX_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "data/indexer/Indexer.h"
|
||||
#include "data/parser/ParserClientImpl.h"
|
||||
#include "utility/file/FileRegister.h"
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
class IndexerCxx: public Indexer<IndexerCommandType>
|
||||
{
|
||||
public:
|
||||
virtual ~IndexerCxx();
|
||||
|
||||
virtual std::shared_ptr<IntermediateStorage> doIndex(
|
||||
std::shared_ptr<IndexerCommandType> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister);
|
||||
};
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
IndexerCxx<IndexerCommandType, ParserType>::~IndexerCxx()
|
||||
{
|
||||
}
|
||||
|
||||
template <typename IndexerCommandType, typename ParserType>
|
||||
std::shared_ptr<IntermediateStorage> IndexerCxx<IndexerCommandType, ParserType>::doIndex(
|
||||
std::shared_ptr<IndexerCommandType> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister)
|
||||
{
|
||||
std::shared_ptr<ParserClientImpl> parserClient = std::make_shared<ParserClientImpl>();
|
||||
|
||||
std::shared_ptr<ParserType> parser = std::make_shared<ParserType>(parserClient, fileRegister);
|
||||
|
||||
std::shared_ptr<IntermediateStorage> storage = std::make_shared<IntermediateStorage>();
|
||||
parserClient->setStorage(storage);
|
||||
|
||||
parser->buildIndex(indexerCommand);
|
||||
|
||||
parserClient->resetStorage();
|
||||
|
||||
if (parserClient->hasFatalErrors() || indexerCommand->preprocessorOnly())
|
||||
{
|
||||
storage->setAllFilesIncomplete();
|
||||
}
|
||||
else
|
||||
{
|
||||
storage->setFilesWithErrorsIncomplete();
|
||||
fileRegister->markIndexingFilesIndexed();
|
||||
}
|
||||
|
||||
if (interrupted())
|
||||
{
|
||||
return std::shared_ptr<IntermediateStorage>();
|
||||
}
|
||||
|
||||
return storage;
|
||||
}
|
||||
|
||||
#endif // INDEXER_CXX_H
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "data/indexer/IndexerFactoryModuleCxxCdb.h"
|
||||
|
||||
#include "data/indexer/Indexer.h"
|
||||
#include "data/indexer/IndexerCxx.h"
|
||||
#include "data/indexer/IndexerCommandCxxCdb.h"
|
||||
#include "data/parser/cxx/CxxParser.h"
|
||||
|
||||
@@ -10,5 +10,5 @@ IndexerFactoryModuleCxxCdb::~IndexerFactoryModuleCxxCdb()
|
||||
|
||||
std::shared_ptr<IndexerBase> IndexerFactoryModuleCxxCdb::createIndexer()
|
||||
{
|
||||
return std::make_shared<Indexer<IndexerCommandCxxCdb, CxxParser>>();
|
||||
return std::make_shared<IndexerCxx<IndexerCommandCxxCdb, CxxParser>>();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "data/indexer/IndexerFactoryModuleCxxManual.h"
|
||||
|
||||
#include "data/indexer/Indexer.h"
|
||||
#include "data/indexer/IndexerCxx.h"
|
||||
#include "data/indexer/IndexerCommandCxxManual.h"
|
||||
#include "data/parser/cxx/CxxParser.h"
|
||||
|
||||
@@ -10,5 +10,5 @@ IndexerFactoryModuleCxxManual::~IndexerFactoryModuleCxxManual()
|
||||
|
||||
std::shared_ptr<IndexerBase> IndexerFactoryModuleCxxManual::createIndexer()
|
||||
{
|
||||
return std::make_shared<Indexer<IndexerCommandCxxManual, CxxParser>>();
|
||||
return std::make_shared<IndexerCxx<IndexerCommandCxxManual, CxxParser>>();
|
||||
}
|
||||
|
||||
@@ -6,6 +6,8 @@ add_files(
|
||||
data/indexer/IndexerCommandJava.h
|
||||
data/indexer/IndexerFactoryModuleJava.cpp
|
||||
data/indexer/IndexerFactoryModuleJava.h
|
||||
data/indexer/IndexerJava.cpp
|
||||
data/indexer/IndexerJava.h
|
||||
|
||||
data/parser/java/JavaParser.cpp
|
||||
data/parser/java/JavaParser.h
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
#include "data/indexer/IndexerFactoryModuleJava.h"
|
||||
|
||||
#include "data/indexer/Indexer.h"
|
||||
#include "data/indexer/IndexerCommandJava.h"
|
||||
#include "data/parser/java/JavaParser.h"
|
||||
#include "data/indexer/IndexerJava.h"
|
||||
|
||||
IndexerFactoryModuleJava::~IndexerFactoryModuleJava()
|
||||
{
|
||||
@@ -10,5 +8,5 @@ IndexerFactoryModuleJava::~IndexerFactoryModuleJava()
|
||||
|
||||
std::shared_ptr<IndexerBase> IndexerFactoryModuleJava::createIndexer()
|
||||
{
|
||||
return std::make_shared<Indexer<IndexerCommandJava, JavaParser>>();
|
||||
return std::make_shared<IndexerJava>();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
#include "data/indexer/IndexerJava.h"
|
||||
|
||||
#include "data/indexer/IndexerCommandJava.h"
|
||||
#include "data/parser/ParserClientImpl.h"
|
||||
#include "data/parser/java/JavaParser.h"
|
||||
#include "utility/file/FileRegister.h"
|
||||
|
||||
IndexerJava::~IndexerJava()
|
||||
{
|
||||
JavaParser::clearCaches();
|
||||
}
|
||||
|
||||
std::shared_ptr<IntermediateStorage> IndexerJava::doIndex(
|
||||
std::shared_ptr<IndexerCommandJava> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister)
|
||||
{
|
||||
std::shared_ptr<ParserClientImpl> parserClient = std::make_shared<ParserClientImpl>();
|
||||
|
||||
std::shared_ptr<JavaParser> parser = std::make_shared<JavaParser>(parserClient, fileRegister);
|
||||
|
||||
std::shared_ptr<IntermediateStorage> storage = std::make_shared<IntermediateStorage>();
|
||||
parserClient->setStorage(storage);
|
||||
|
||||
parser->buildIndex(indexerCommand);
|
||||
|
||||
parserClient->resetStorage();
|
||||
|
||||
if (parserClient->hasFatalErrors() || indexerCommand->preprocessorOnly())
|
||||
{
|
||||
storage->setAllFilesIncomplete();
|
||||
}
|
||||
else
|
||||
{
|
||||
storage->setFilesWithErrorsIncomplete();
|
||||
fileRegister->markIndexingFilesIndexed();
|
||||
}
|
||||
|
||||
if (interrupted())
|
||||
{
|
||||
return std::shared_ptr<IntermediateStorage>();
|
||||
}
|
||||
|
||||
return storage;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#ifndef INDEXER_JAVA_H
|
||||
#define INDEXER_JAVA_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "data/indexer/IndexerCommandJava.h"
|
||||
#include "data/indexer/Indexer.h"
|
||||
|
||||
class IndexerJava: public Indexer<IndexerCommandJava>
|
||||
{
|
||||
public:
|
||||
virtual ~IndexerJava();
|
||||
|
||||
virtual std::shared_ptr<IntermediateStorage> doIndex(
|
||||
std::shared_ptr<IndexerCommandJava> indexerCommand,
|
||||
std::shared_ptr<FileRegister> fileRegister);
|
||||
};
|
||||
|
||||
#endif // INDEXER_JAVA_H
|
||||
@@ -10,6 +10,18 @@ JavaEnvironment::~JavaEnvironment()
|
||||
JavaEnvironmentFactory::getInstance()->unregisterEnvironment();
|
||||
}
|
||||
|
||||
bool JavaEnvironment::callStaticVoidMethod(std::string className, std::string methodName)
|
||||
{
|
||||
jclass javaClass = getJavaClass(className);
|
||||
jmethodID javaMethodId = getJavaStaticMethod(javaClass, methodName, "()V");
|
||||
if(javaMethodId != nullptr)
|
||||
{
|
||||
m_env->CallStaticVoidMethod(javaClass, javaMethodId);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool JavaEnvironment::callStaticVoidMethod(std::string className, std::string methodName, int arg1, std::string arg2, std::string arg3, std::string arg4, int arg5)
|
||||
{
|
||||
jclass javaClass = getJavaClass(className);
|
||||
|
||||
@@ -32,6 +32,7 @@ public:
|
||||
};
|
||||
|
||||
~JavaEnvironment();
|
||||
bool callStaticVoidMethod(std::string className, std::string methodName);
|
||||
bool callStaticVoidMethod(std::string className, std::string methodName, int arg1, std::string arg2, std::string arg3, std::string arg4, int arg5);
|
||||
bool callStaticMethod(std::string className, std::string methodName, std::string& ret, std::string arg1);
|
||||
|
||||
|
||||
@@ -28,7 +28,6 @@ void JavaEnvironmentFactory::createInstance(std::string classPath, std::string&
|
||||
}
|
||||
|
||||
std::function<jint (JavaVM**, void**, void*)> createInstanceFunction;
|
||||
|
||||
const FilePath javaPath(ApplicationSettings::getInstance()->getJavaPath());
|
||||
createInstanceFunction = utility::loadFunctionFromLibrary<jint, JavaVM**, void**, void*>(
|
||||
javaPath,
|
||||
|
||||
@@ -26,7 +26,7 @@ std::string JavaParser::prepareJavaEnvironment()
|
||||
const std::string separator = ":";
|
||||
#endif
|
||||
JavaEnvironmentFactory::createInstance(
|
||||
ResourcePaths::getJavaPath().str() + "guava-18.0.jar" + separator +
|
||||
ResourcePaths::getJavaPath().str() + "guava-21.0.jar" + separator +
|
||||
ResourcePaths::getJavaPath().str() + "java-indexer.jar" + separator +
|
||||
ResourcePaths::getJavaPath().str() + "javaparser-core.jar" + separator +
|
||||
ResourcePaths::getJavaPath().str() + "javaslang-2.0.3.jar" + separator +
|
||||
@@ -41,6 +41,22 @@ std::string JavaParser::prepareJavaEnvironment()
|
||||
return errorString;
|
||||
}
|
||||
|
||||
void JavaParser::clearCaches()
|
||||
{
|
||||
std::shared_ptr<JavaEnvironmentFactory> factory = JavaEnvironmentFactory::getInstance();
|
||||
if (factory)
|
||||
{
|
||||
std::shared_ptr<JavaEnvironment> environment = factory->createEnvironment();
|
||||
if (environment)
|
||||
{
|
||||
environment->callStaticVoidMethod(
|
||||
"com/sourcetrail/JavaIndexer",
|
||||
"clearCaches"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
JavaParser::JavaParser(std::shared_ptr<ParserClient> client, std::shared_ptr<FileRegister> fileRegister)
|
||||
: Parser(client)
|
||||
, m_id(s_nextParserId++)
|
||||
|
||||
@@ -33,6 +33,7 @@ class JavaParser: public Parser
|
||||
public:
|
||||
// returns: error message
|
||||
static std::string prepareJavaEnvironment();
|
||||
static void clearCaches();
|
||||
|
||||
JavaParser(std::shared_ptr<ParserClient> client, std::shared_ptr<FileRegister> fileRegister);
|
||||
~JavaParser();
|
||||
|
||||
@@ -108,6 +108,7 @@ std::vector<std::shared_ptr<IndexerCommand>> SourceGroupJava::getIndexerCommands
|
||||
bool SourceGroupJava::prepareJavaEnvironment()
|
||||
{
|
||||
const std::string errorString = JavaParser::prepareJavaEnvironment();
|
||||
|
||||
if (errorString.size() > 0)
|
||||
{
|
||||
LOG_ERROR(errorString);
|
||||
|
||||
@@ -817,7 +817,7 @@ private:
|
||||
const std::string separator = ":";
|
||||
#endif
|
||||
JavaEnvironmentFactory::createInstance(
|
||||
"../app/data/java/guava-18.0.jar" + separator +
|
||||
"../app/data/java/guava-21.0.jar" + separator +
|
||||
"../app/data/java/java-indexer.jar" + separator +
|
||||
"../app/data/java/javaparser-core.jar" + separator +
|
||||
"../app/data/java/javaslang-2.0.3.jar" + separator +
|
||||
|
||||
Reference in New Issue
Block a user