ui: show when type is built-in (issue #2)

* renamed DefinitionType to DefinitionKind
* passing DefinitionKind from Java to C++ instead of just a single bool
* omitting to create a symbol for undefined types

fortune cookie message = Happy news is on the way to you.
This commit is contained in:
malte_langkabel
2017-01-23 15:55:29 +01:00
parent 6ea248b500
commit 2759018374
30 changed files with 214 additions and 161 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ package io.coati;
import com.github.javaparser.ast.AccessSpecifier;
public enum AccessKind
{ // these values need to be the same as AccesType in C++ code
{ // these values need to be the same as AccesKind in C++ code
NONE(0),
PUBLIC(1),
PROTECTED(2),
@@ -0,0 +1,20 @@
package io.coati;
public enum DefinitionKind
{ // these values need to be the same as DefinitionKind in C++ code
NONE(0),
IMPLICIT(1),
EXPLICIT(2);
private final int m_value;
private DefinitionKind(int value)
{
this.m_value = value;
}
public int getValue()
{
return m_value;
}
}
+36 -24
View File
@@ -78,10 +78,11 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
JavaIndexer.recordSymbolWithLocationAndScope(
m_callbackId,
JavaparserDeclNameResolver.getQualifiedName(name).toSerializedNameHierarchy(),
SymbolType.PACKAGE,
SymbolKind.PACKAGE,
name.getRange(),
n.getRange(),
AccessKind.NONE, false
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
while (name.getQualifier().isPresent())
@@ -90,8 +91,9 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
JavaIndexer.recordSymbol(
m_callbackId,
JavaparserDeclNameResolver.getQualifiedName(name).toSerializedNameHierarchy(),
SymbolType.PACKAGE, AccessKind.NONE,
false
SymbolKind.PACKAGE,
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
}
@@ -105,10 +107,11 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithLocationAndScope(
m_callbackId, qualifiedName, (n.isInterface() ? SymbolType.INTERFACE : SymbolType.CLASS),
m_callbackId, qualifiedName, (n.isInterface() ? SymbolKind.INTERFACE : SymbolKind.CLASS),
name.getRange(),
n.getRange(),
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())), false
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())),
DefinitionKind.EXPLICIT
);
if (n.getRange().isPresent())
@@ -152,9 +155,10 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
}
JavaIndexer.recordSymbolWithLocation(
m_callbackId, qualifiedName, SymbolType.TYPE_PARAMETER,
m_callbackId, qualifiedName, SymbolKind.TYPE_PARAMETER,
range,
AccessKind.TYPE_PARAMETER, false
AccessKind.TYPE_PARAMETER,
DefinitionKind.EXPLICIT
);
List<DeclContext> parentContext = m_context;
@@ -171,10 +175,11 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithLocationAndScope(
m_callbackId, qualifiedName, SymbolType.ENUM,
m_callbackId, qualifiedName, SymbolKind.ENUM,
name.getRange(),
n.getRange(),
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())), false
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())),
DefinitionKind.EXPLICIT
);
if (n.getRange().isPresent())
@@ -195,9 +200,10 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithLocation(
m_callbackId, qualifiedName, SymbolType.ENUM_CONSTANT,
m_callbackId, qualifiedName, SymbolKind.ENUM_CONSTANT,
n.getRange(),
AccessKind.NONE, false
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
List<DeclContext> parentContext = m_context;
@@ -214,10 +220,11 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithLocationAndScope(
m_callbackId, qualifiedName, SymbolType.METHOD,
m_callbackId, qualifiedName, SymbolKind.METHOD,
name.getRange(),
n.getRange(),
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())), false
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())),
DefinitionKind.EXPLICIT
);
List<DeclContext> parentContext = m_context;
@@ -234,10 +241,11 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String qualifiedName = JavaparserDeclNameResolver.getQualifiedDeclName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbolWithLocationAndScope(
m_callbackId, qualifiedName, SymbolType.METHOD,
m_callbackId, qualifiedName, SymbolKind.METHOD,
name.getRange(),
n.getRange(),
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())), false
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())),
DefinitionKind.EXPLICIT
);
@@ -329,9 +337,10 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
SimpleName name = declarator.getName();
JavaIndexer.recordSymbolWithLocation(
m_callbackId, qualifiedName, SymbolType.FIELD,
m_callbackId, qualifiedName, SymbolKind.FIELD,
name.getRange(),
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())), false
AccessKind.fromAccessSpecifier(Modifier.getAccessSpecifier(n.getModifiers())),
DefinitionKind.EXPLICIT
);
m_context.add(new DeclContext(qualifiedName));
@@ -562,8 +571,9 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbol(
m_callbackId, referencedName, SymbolType.BUILTIN_TYPE,
AccessKind.NONE, true
m_callbackId, referencedName, SymbolKind.BUILTIN_TYPE,
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
for (DeclContext context: m_context)
@@ -589,8 +599,9 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
String referencedName = JavaparserTypeNameResolver.getQualifiedTypeName(n, m_typeSolver).toSerializedNameHierarchy();
JavaIndexer.recordSymbol(
m_callbackId, referencedName, SymbolType.BUILTIN_TYPE,
AccessKind.NONE, true
m_callbackId, referencedName, SymbolKind.BUILTIN_TYPE,
AccessKind.NONE,
DefinitionKind.EXPLICIT
);
for (DeclContext context: m_context)
@@ -805,9 +816,10 @@ public class JavaAstVisitor extends JavaAstVisitorAdapter
JavaIndexer.logError(m_callbackId, e + " at " + m_filePath + "<"+ beginLine + ", " + beginColumn + ">");
JavaIndexer.recordSymbolWithLocation(
m_callbackId, "unsolved-symbol\ts\tp", SymbolType.TYPE_MAX,
m_callbackId, "unsolved-symbol\ts\tp", SymbolKind.TYPE_MAX,
n.getRange(),
AccessKind.DEFAULT, false
AccessKind.DEFAULT,
DefinitionKind.EXPLICIT
);
}
+18 -18
View File
@@ -126,69 +126,69 @@ public class JavaIndexer
// helpers
static public void recordSymbol(
int address, String symbolName, SymbolType symbolType,
AccessKind access, boolean isImplicit
int address, String symbolName, SymbolKind symbolType,
AccessKind access, DefinitionKind definitionKind
)
{
recordSymbol(
address, symbolName, symbolType.getValue(),
access.getValue(), (isImplicit ? 1 : 0)
access.getValue(), definitionKind.getValue()
);
}
static public void recordSymbolWithLocation(
int address, String symbolName, SymbolType symbolType,
int address, String symbolName, SymbolKind symbolType,
Optional<Range> range,
AccessKind access, boolean isImplicit
AccessKind access, DefinitionKind definitionKind
)
{
recordSymbolWithLocation(
address, symbolName, symbolType,
range.orElse(Range.range(0, 0, 0, 0)),
access, isImplicit
access, definitionKind
);
}
static public void recordSymbolWithLocation(
int address, String symbolName, SymbolType symbolType,
int address, String symbolName, SymbolKind symbolType,
Range range,
AccessKind access, boolean isImplicit
AccessKind access, DefinitionKind definitionKind
)
{
recordSymbolWithLocation(
address, symbolName, symbolType.getValue(),
range.begin.line, range.begin.column, range.end.line, range.end.column,
access.getValue(), (isImplicit ? 1 : 0)
access.getValue(), definitionKind.getValue()
);
}
static public void recordSymbolWithLocationAndScope(
int address, String symbolName, SymbolType symbolType,
int address, String symbolName, SymbolKind symbolType,
Optional<Range> range,
Optional<Range> scopeRange,
AccessKind access, boolean isImplicit
AccessKind access, DefinitionKind definitionKind
)
{
recordSymbolWithLocationAndScope(
address, symbolName, symbolType,
range.orElse(Range.range(0, 0, 0, 0)),
scopeRange.orElse(Range.range(0, 0, 0, 0)),
access, isImplicit
access, definitionKind
);
}
static public void recordSymbolWithLocationAndScope(
int address, String symbolName, SymbolType symbolType,
int address, String symbolName, SymbolKind symbolType,
Range range,
Range scopeRange,
AccessKind access, boolean isImplicit
AccessKind access, DefinitionKind definitionKind
)
{
recordSymbolWithLocationAndScope(
address, symbolName, symbolType.getValue(),
range.begin.line, range.begin.column, range.end.line, range.end.column,
scopeRange.begin.line, scopeRange.begin.column, scopeRange.end.line, scopeRange.end.column,
access.getValue(), (isImplicit ? 1 : 0)
access.getValue(), definitionKind.getValue()
);
}
@@ -284,20 +284,20 @@ public class JavaIndexer
static private native void recordSymbol(
int address, String symbolName, int symbolType,
int access, int isImplicit
int access, int definitionKind
);
static private native void recordSymbolWithLocation(
int address, String symbolName, int symbolType,
int beginLine, int beginColumn, int endLine, int endColumn,
int access, int isImplicit
int access, int definitionKind
);
static private native void recordSymbolWithLocationAndScope(
int address, String symbolName, int symbolType,
int beginLine, int beginColumn, int endLine, int endColumn,
int scopeBeginLine, int scopeBeginColumn, int scopeEndLine, int scopeEndColumn,
int access, int isImplicit
int access, int definitionKind
);
static private native void recordReference(
+1 -1
View File
@@ -1,7 +1,7 @@
package io.coati;
public enum ReferenceKind
{
{ // these values need to be the same as ReferenceKind in C++ code
UNDEFINED(0),
TYPE_USAGE(1),
USAGE(2),
@@ -1,7 +1,7 @@
package io.coati;
public enum SymbolType
{ // these values need to be the same as SymbolType in C++ code
public enum SymbolKind
{ // these values need to be the same as SymbolKind in C++ code
BUILTIN_TYPE(1),
CLASS(2),
ENUM(3),
@@ -25,7 +25,7 @@ public enum SymbolType
private final int m_value;
private SymbolType(int value)
private SymbolKind(int value)
{
this.m_value = value;
}
+20
View File
@@ -0,0 +1,20 @@
#include "data/DefinitionKind.h"
int definitionKindToInt(DefinitionKind definitionKind)
{
return definitionKind;
}
DefinitionKind intToDefinitionKind(int definitionKind)
{
switch (definitionKind)
{
case 0:
return DEFINITION_NONE;
case 1:
return DEFINITION_IMPLICIT;
case 2:
return DEFINITION_EXPLICIT;
}
return DEFINITION_NONE;
}
+14
View File
@@ -0,0 +1,14 @@
#ifndef DEFINITION_KIND_H
#define DEFINITION_KIND_H
enum DefinitionKind
{ // these values need to be the same as DefinitionKind in Java code
DEFINITION_NONE = 0,
DEFINITION_IMPLICIT = 1,
DEFINITION_EXPLICIT = 2
};
int definitionKindToInt(DefinitionKind definitionKind);
DefinitionKind intToDefinitionKind(int definitionKind);
#endif // DEFINITION_TYPE_H
-20
View File
@@ -1,20 +0,0 @@
#include "data/DefinitionType.h"
int definitionTypeToInt(DefinitionType definitionType)
{
return definitionType;
}
DefinitionType intToDefinitionType(int definitionType)
{
switch (definitionType)
{
case 0:
return DEFINITION_NONE;
case 1:
return DEFINITION_IMPLICIT;
case 2:
return DEFINITION_EXPLICIT;
}
return DEFINITION_NONE;
}
-14
View File
@@ -1,14 +0,0 @@
#ifndef DEFINITION_TYPE_H
#define DEFINITION_TYPE_H
enum DefinitionType
{
DEFINITION_NONE = 0,
DEFINITION_IMPLICIT = 1,
DEFINITION_EXPLICIT = 2
};
int definitionTypeToInt(DefinitionType definitionType);
DefinitionType intToDefinitionType(int definitionType);
#endif // DEFINITION_TYPE_H
+2 -2
View File
@@ -65,9 +65,9 @@ void IntermediateStorage::addFile(const Id id, const std::string& filePath, cons
m_files.push_back(StorageFile(id, filePath, modificationTime));
}
void IntermediateStorage::addSymbol(const Id id, int definitionType)
void IntermediateStorage::addSymbol(const Id id, int definitionKind)
{
m_symbols.push_back(StorageSymbol(id, definitionType));
m_symbols.push_back(StorageSymbol(id, definitionKind));
}
Id IntermediateStorage::addEdge(int type, Id sourceId, Id targetId)
+1 -1
View File
@@ -19,7 +19,7 @@ public:
virtual Id addNode(int type, const std::string& serializedName);
virtual void addFile(const Id id, const std::string& filePath, const std::string& modificationTime);
virtual void addSymbol(const Id id, int definitionType);
virtual void addSymbol(const Id id, int definitionKind);
virtual Id addEdge(int type, Id sourceId, Id targetId);
virtual Id addLocalSymbol(const std::string& name);
virtual Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type);
+13 -13
View File
@@ -65,11 +65,11 @@ void PersistentStorage::addFile(const Id id, const std::string& filePath, const
}
}
void PersistentStorage::addSymbol(const Id id, int definitionType)
void PersistentStorage::addSymbol(const Id id, int definitionKind)
{
if (m_sqliteStorage.getFirstById<StorageSymbol>(id).id == 0)
{
m_sqliteStorage.addSymbol(id, definitionType);
m_sqliteStorage.addSymbol(id, definitionKind);
}
}
@@ -607,8 +607,8 @@ std::set<SearchMatch> PersistentStorage::getAutocompletionSymbolMatches(const st
match.typeName = Node::getTypeString(match.nodeType);
match.searchType = SearchMatch::SEARCH_TOKEN;
if (storageSymbolMap.find(firstNode->id) == storageSymbolMap.end()
&& match.nodeType != Node::NODE_UNDEFINED)
if (storageSymbolMap.find(firstNode->id) == storageSymbolMap.end() &&
match.nodeType != Node::NODE_UNDEFINED)
{
match.typeName = "undefined " + match.typeName;
}
@@ -722,7 +722,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForAll() const
std::unordered_set<Id> explicitlyDefinedSymbolIds;
for (StorageSymbol symbol: m_sqliteStorage.getAll<StorageSymbol>())
{
if (intToDefinitionType(symbol.definitionType) == DEFINITION_EXPLICIT)
if (intToDefinitionKind(symbol.definitionKind) == DEFINITION_EXPLICIT)
{
explicitlyDefinedSymbolIds.insert(symbol.id);
}
@@ -822,7 +822,7 @@ std::shared_ptr<Graph> PersistentStorage::getGraphForActiveTokenIds(const std::v
{
for (const StorageSymbol& symbol : m_sqliteStorage.getAllByIds<StorageSymbol>(ids))
{
if (symbol.id > 0 && (!isNamespace || intToDefinitionType(symbol.definitionType) != DEFINITION_IMPLICIT))
if (symbol.id > 0 && (!isNamespace || intToDefinitionKind(symbol.definitionKind) != DEFINITION_IMPLICIT))
{
nodeIds.push_back(symbol.id);
}
@@ -912,7 +912,7 @@ std::vector<Id> PersistentStorage::getNodeIdsForLocationIds(const std::vector<Id
StorageSymbol symbol = m_sqliteStorage.getFirstById<StorageSymbol>(elementId);
if (symbol.id != 0) // here we test if location is a symbol
{
if (intToDefinitionType(symbol.definitionType) == DEFINITION_IMPLICIT)
if (intToDefinitionKind(symbol.definitionKind) == DEFINITION_IMPLICIT)
{
implicitNodeIds.insert(elementId);
}
@@ -1472,25 +1472,25 @@ void PersistentStorage::addNodesToGraph(const std::vector<Id>& nodeIds, Graph* g
{
const NameHierarchy nameHierarchy = NameHierarchy::deserialize(storageNode.serializedName);
DefinitionType defType = DEFINITION_NONE;
DefinitionKind defKind = DEFINITION_NONE;
auto it = symbolMap.find(storageNode.id);
if (it != symbolMap.end())
{
defType = intToDefinitionType(it->second.definitionType);
defKind = intToDefinitionKind(it->second.definitionKind);
}
Node* node = graph->createNode(
storageNode.id,
type,
nameHierarchy,
defType != DEFINITION_NONE
defKind != DEFINITION_NONE
);
if (defType == DEFINITION_IMPLICIT)
if (defKind == DEFINITION_IMPLICIT)
{
node->setImplicit(true);
}
else if (defType == DEFINITION_EXPLICIT)
else if (defKind == DEFINITION_EXPLICIT)
{
node->setExplicit(true);
}
@@ -1733,7 +1733,7 @@ void PersistentStorage::buildSearchIndex()
else
{
auto it = symbolMap.find(node.id);
if (it == symbolMap.end() || intToDefinitionType(it->second.definitionType) != DEFINITION_IMPLICIT)
if (it == symbolMap.end() || intToDefinitionKind(it->second.definitionKind) != DEFINITION_IMPLICIT)
{
// we don't use the signature here, so elements with the same signature share the same node.
m_symbolIndex.addNode(node.id, NameHierarchy::deserialize(node.serializedName).getQualifiedName());
+1 -1
View File
@@ -29,7 +29,7 @@ public:
virtual Id addNode(int type, const std::string& serializedName);
virtual void addFile(const Id id, const std::string& filePath, const std::string& modificationTime);
virtual void addSymbol(const Id id, int definitionType);
virtual void addSymbol(const Id id, int definitionKind);
virtual Id addEdge(int type, Id sourceId, Id targetId);
virtual Id addLocalSymbol(const std::string& name);
virtual Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type);
+8 -16
View File
@@ -4,13 +4,12 @@
#include "data/graph/Node.h"
#include "data/location/TokenLocation.h"
#include "data/DefinitionType.h"
#include "data/parser/ParseLocation.h"
#include "utility/logging/logging.h"
#include "utility/text/TextAccess.h"
#include "utility/Version.h"
const size_t SqliteStorage::STORAGE_VERSION = 7;
const size_t SqliteStorage::STORAGE_VERSION = 8;
SqliteStorage::SqliteStorage(const FilePath& dbFilePath)
: m_dbFilePath(dbFilePath)
@@ -198,11 +197,11 @@ Id SqliteStorage::addNode(const int type, const std::string& serializedName)
return id;
}
void SqliteStorage::addSymbol(const int id, const int definitionType)
void SqliteStorage::addSymbol(const int id, const int definitionKind)
{
executeStatement(
"INSERT INTO symbol(id, definition_type) VALUES("
+ std::to_string(id) + ", " + std::to_string(definitionType) + ");"
"INSERT INTO symbol(id, definition_kind) VALUES("
+ std::to_string(id) + ", " + std::to_string(definitionKind) + ");"
);
}
@@ -587,13 +586,6 @@ void SqliteStorage::setNodeType(int type, Id nodeId)
);
}
void SqliteStorage::setSymbolDefinitionType(int definitionType, Id symbolId)
{
executeStatement(
"UPDATE symbol SET definition_type = " + std::to_string(definitionType) + " WHERE id == " + std::to_string(symbolId) + ";"
);
}
StorageSourceLocation SqliteStorage::getSourceLocationByAll(const Id fileNodeId, const uint startLine, const uint startCol, const uint endLine, const uint endCol, const int type) const
{
return doGetFirst<StorageSourceLocation>(
@@ -769,7 +761,7 @@ void SqliteStorage::setupTables()
m_database.execDML(
"CREATE TABLE IF NOT EXISTS symbol("
"id INTEGER NOT NULL, "
"definition_type INTEGER NOT NULL, "
"definition_kind INTEGER NOT NULL, "
"PRIMARY KEY(id), "
"FOREIGN KEY(id) REFERENCES node(id) ON DELETE CASCADE);"
);
@@ -1057,18 +1049,18 @@ template <>
std::vector<StorageSymbol> SqliteStorage::doGetAll<StorageSymbol>(const std::string& query) const
{
CppSQLite3Query q = executeQuery(
"SELECT id, definition_type FROM symbol " + query + ";"
"SELECT id, definition_kind FROM symbol " + query + ";"
);
std::vector<StorageSymbol> symbols;
while (!q.eof())
{
const Id id = q.getIntField(0, 0);
const int definitionType = q.getIntField(1, 0);
const int definitionKind = q.getIntField(1, 0);
if (id != 0)
{
symbols.push_back(StorageSymbol(id, definitionType));
symbols.push_back(StorageSymbol(id, definitionKind));
}
q.nextRow();
+1 -2
View File
@@ -58,7 +58,7 @@ public:
Id addEdge(int type, Id sourceNodeId, Id targetNodeId);
Id addNode(const int type, const std::string& serializedName);
void addSymbol(const int id, int definitionType);
void addSymbol(const int id, int definitionKind);
void addFile(const int id, const std::string& filePath, const std::string& modificationTime);
Id addLocalSymbol(const std::string& name);
Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type);
@@ -102,7 +102,6 @@ public:
std::shared_ptr<TextAccess> getFileContentById(Id fileId) const;
void setNodeType(int type, Id nodeId);
void setSymbolDefinitionType(int definitionType, Id symbolId);
StorageSourceLocation getSourceLocationByAll(const Id fileNodeId, const uint startLine, const uint startCol, const uint endLine, const uint endCol, const int type) const;
std::shared_ptr<TokenLocationFile> getTokenLocationsForFile(const FilePath& filePath) const;
+1 -1
View File
@@ -61,7 +61,7 @@ void Storage::inject(Storage* injected)
}
const Id ownId = it->second;
addSymbol(ownId, injectedData.definitionType);
addSymbol(ownId, injectedData.definitionKind);
}
);
+1 -1
View File
@@ -17,7 +17,7 @@ public:
virtual Id addNode(int type, const std::string& serializedName) = 0;
virtual void addFile(const Id id, const std::string& filePath, const std::string& modificationTime) = 0;
virtual void addSymbol(const Id id, int definitionType) = 0;
virtual void addSymbol(const Id id, int definitionKind) = 0;
virtual Id addEdge(int type, Id sourceId, Id targetId) = 0;
virtual Id addLocalSymbol(const std::string& name) = 0;
virtual Id addSourceLocation(Id fileNodeId, uint startLine, uint startCol, uint endLine, uint endCol, int type) = 0;
+5 -5
View File
@@ -6,7 +6,7 @@
#include "utility/file/FilePath.h"
#include "utility/types.h"
#include "data/DefinitionType.h"
#include "data/DefinitionKind.h"
struct StorageEdge
{
@@ -53,16 +53,16 @@ struct StorageSymbol
{
StorageSymbol()
: id(0)
, definitionType(definitionTypeToInt(DEFINITION_NONE))
, definitionKind(definitionKindToInt(DEFINITION_NONE))
{}
StorageSymbol(Id id, int definitionType)
StorageSymbol(Id id, int definitionKind)
: id(id)
, definitionType(definitionType)
, definitionKind(definitionKind)
{}
Id id;
int definitionType;
int definitionKind;
};
struct StorageFile
+1 -1
View File
@@ -2,7 +2,7 @@
#define ACCESS_KIND_H
enum AccessKind
{ // these values need to be the same as AccessType in Java code
{ // these values need to be the same as AccessKind in Java code
ACCESS_NONE = 0,
ACCESS_PUBLIC = 1,
ACCESS_PROTECTED = 2,
+4 -4
View File
@@ -8,7 +8,7 @@
#include "data/parser/AccessKind.h"
#include "data/parser/ReferenceKind.h"
#include "data/parser/SymbolKind.h"
#include "data/DefinitionType.h"
#include "data/DefinitionKind.h"
#include "utility/file/FileInfo.h"
#include "utility/types.h"
@@ -33,17 +33,17 @@ public:
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
AccessKind access, DefinitionType definitionType) = 0;
AccessKind access, DefinitionKind definitionKind) = 0;
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location,
AccessKind access, DefinitionType definitionType) = 0;
AccessKind access, DefinitionKind definitionKind) = 0;
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location, const ParseLocation& scopeLocation,
AccessKind access, DefinitionType definitionType) = 0;
AccessKind access, DefinitionKind definitionKind) = 0;
virtual void recordReference(
ReferenceKind referenceKind, const NameHierarchy& referencedName, const NameHierarchy& contextName,
+12 -9
View File
@@ -35,11 +35,11 @@ void ParserClientImpl::finishParsingFile()
Id ParserClientImpl::recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
AccessKind access, DefinitionType definitionType
AccessKind access, DefinitionKind definitionKind
)
{
Id nodeId = addNodeHierarchy(symbolName, symbolKindToNodeType(symbolType));
addSymbol(nodeId, definitionType);
addSymbol(nodeId, definitionKind);
addAccess(nodeId, access);
return nodeId;
}
@@ -47,10 +47,10 @@ Id ParserClientImpl::recordSymbol(
Id ParserClientImpl::recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location,
AccessKind access, DefinitionType definitionType
AccessKind access, DefinitionKind definitionKind
)
{
Id nodeId = recordSymbol(symbolName, symbolType, access, definitionType);
Id nodeId = recordSymbol(symbolName, symbolType, access, definitionKind);
addSourceLocation(nodeId, location, locationTypeToInt(LOCATION_TOKEN));
return nodeId;
}
@@ -58,10 +58,10 @@ Id ParserClientImpl::recordSymbol(
Id ParserClientImpl::recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location, const ParseLocation& scopeLocation,
AccessKind access, DefinitionType definitionType
AccessKind access, DefinitionKind definitionKind
)
{
Id nodeId = recordSymbol(symbolName, symbolType, location, access, definitionType);
Id nodeId = recordSymbol(symbolName, symbolType, location, access, definitionKind);
addSourceLocation(nodeId, scopeLocation, locationTypeToInt(LOCATION_SCOPE));
return nodeId;
}
@@ -236,17 +236,20 @@ void ParserClientImpl::addFile(Id id, const FilePath& filePath, const std::strin
return;
}
return m_storage->addFile(id, filePath.str(), modificationTime);
m_storage->addFile(id, filePath.str(), modificationTime);
}
void ParserClientImpl::addSymbol(Id id, DefinitionType definitionType)
void ParserClientImpl::addSymbol(Id id, DefinitionKind definitionKind)
{
if (!m_storage)
{
return;
}
return m_storage->addSymbol(id, definitionTypeToInt(definitionType));
if (definitionKind != DEFINITION_NONE)
{
m_storage->addSymbol(id, definitionKindToInt(definitionKind));
}
}
Id ParserClientImpl::addEdge(int type, Id sourceId, Id targetId)
+5 -5
View File
@@ -8,7 +8,7 @@
#include "data/IntermediateStorage.h"
#include "data/graph/token_component/TokenComponentAccess.h"
#include "data/DefinitionType.h"
#include "data/DefinitionKind.h"
class ParserClientImpl: public ParserClient
{
@@ -24,17 +24,17 @@ public:
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
AccessKind access, DefinitionType definitionType);
AccessKind access, DefinitionKind definitionKind);
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location,
AccessKind access, DefinitionType definitionType);
AccessKind access, DefinitionKind definitionKind);
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolType,
const ParseLocation& location, const ParseLocation& scopeLocation,
AccessKind access, DefinitionType definitionType);
AccessKind access, DefinitionKind definitionKind);
virtual void recordReference(
ReferenceKind referenceKind, const NameHierarchy& referencedName, const NameHierarchy& contextName,
@@ -53,7 +53,7 @@ private:
Id addNode(Node::NodeType nodeType, NameHierarchy nameHierarchy);
void addFile(Id id, const FilePath& filePath, const std::string& modificationTime);
void addSymbol(Id id, DefinitionType definitionType);
void addSymbol(Id id, DefinitionKind definitionKind);
Id addEdge(int type, Id sourceId, Id targetId);
Id addLocalSymbol(const std::string& name);
void addSourceLocation(Id elementId, const ParseLocation& location, int type);
+1 -1
View File
@@ -2,7 +2,7 @@
#define SYMBOL_KIND_H
enum SymbolKind
{ // these values need to be the same as SymbolType in Java code
{ // these values need to be the same as SymbolKind in Java code
SYMBOL_BUILTIN_TYPE = 1,
SYMBOL_CLASS = 2,
SYMBOL_ENUM = 3,
@@ -67,10 +67,10 @@ void CxxAstVisitorComponentIndexer::visitTagDecl(clang::TagDecl* d)
{
if (shouldVisitDecl(d))
{
DefinitionType definitionType = DEFINITION_NONE;
DefinitionKind definitionKind = DEFINITION_NONE;
if (d->isThisDeclarationADefinition())
{
definitionType = utility::isImplicit(d) ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT;
definitionKind = utility::isImplicit(d) ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT;
}
m_client->recordSymbol(
@@ -79,7 +79,7 @@ void CxxAstVisitorComponentIndexer::visitTagDecl(clang::TagDecl* d)
getParseLocation(d->getLocation()),
getParseLocationOfTagDeclBody(d),
utility::convertAccessSpecifier(d->getAccess()),
definitionType
definitionKind
);
}
}
@@ -377,6 +377,11 @@ void CxxAstVisitorComponentIndexer::visitTypeLoc(clang::TypeLoc tl)
if ((shouldVisitReference(tl.getBeginLoc(), getAstVisitor()->getComponent<CxxAstVisitorComponentContext>()->getTopmostContextDecl())) &&
(!getAstVisitor()->checkIgnoresTypeLoc(tl)))
{
if (const clang::BuiltinType* builtinType = clang::dyn_cast_or_null<clang::BuiltinType>(tl.getTypePtr()))
{
m_client->recordSymbol(getAstVisitor()->getTypeNameCache()->getValue(tl.getTypePtr()), SYMBOL_BUILTIN_TYPE, ACCESS_NONE, DEFINITION_EXPLICIT);
}
clang::SourceLocation loc;
if (!tl.getAs<clang::DependentNameTypeLoc>().isNull())
{
+2
View File
@@ -139,8 +139,10 @@ void JavaProject::fetchRootDirectories()
m_projectSettings->getAbsoluteExcludePaths(),
m_projectSettings->getSourceExtensions()
);
FileManager::FileSets fileSets = fileManager.fetchFilePaths(std::vector<FileInfo>());
std::shared_ptr<JavaEnvironment> javaEnvironment = JavaEnvironmentFactory::getInstance()->createEnvironment();
for (FilePath filePath: fileSets.addedFiles)
{
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(filePath.str());
+9 -9
View File
@@ -133,35 +133,35 @@ void JavaParser::doLogError(jstring jError)
void JavaParser::doRecordSymbol(
jstring jSymbolName, jint jSymbolType,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
)
{
AccessKind access = intToAccessKind(jAccess);
bool isImplicit = jIsImplicit;
DefinitionKind definitionKind = intToDefinitionKind(jDefinitionKind);
m_client->recordSymbol(
NameHierarchy::deserialize(m_javaEnvironment->toStdString(jSymbolName)),
intToSymbolKind(jSymbolType),
access,
isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT
definitionKind
);
}
void JavaParser::doRecordSymbolWithLocation(
jstring jSymbolName, jint jSymbolType,
jint beginLine, jint beginColumn, jint endLine, jint endColumn,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
)
{
AccessKind access = intToAccessKind(jAccess);
bool isImplicit = jIsImplicit;
DefinitionKind definitionKind = intToDefinitionKind(jDefinitionKind);
m_client->recordSymbol(
NameHierarchy::deserialize(m_javaEnvironment->toStdString(jSymbolName)),
intToSymbolKind(jSymbolType),
ParseLocation(m_currentFilePath, beginLine, beginColumn, endLine, endColumn),
access,
isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT
definitionKind
);
}
@@ -169,11 +169,11 @@ void JavaParser::doRecordSymbolWithLocationAndScope(
jstring jSymbolName, jint jSymbolType,
jint beginLine, jint beginColumn, jint endLine, jint endColumn,
jint scopeBeginLine, jint scopeBeginColumn, jint scopeEndLine, jint scopeEndColumn,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
)
{
AccessKind access = intToAccessKind(jAccess);
bool isImplicit = jIsImplicit;
DefinitionKind definitionKind = intToDefinitionKind(jDefinitionKind);
m_client->recordSymbol(
NameHierarchy::deserialize(m_javaEnvironment->toStdString(jSymbolName)),
@@ -181,7 +181,7 @@ void JavaParser::doRecordSymbolWithLocationAndScope(
ParseLocation(m_currentFilePath, beginLine, beginColumn, endLine, endColumn),
ParseLocation(m_currentFilePath, scopeBeginLine, scopeBeginColumn, scopeEndLine, scopeEndColumn),
access,
isImplicit ? DEFINITION_IMPLICIT : DEFINITION_EXPLICIT
definitionKind
);
}
+3 -3
View File
@@ -147,20 +147,20 @@ private:
void doRecordSymbol(
jstring jSymbolName, jint jSymbolType,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
);
void doRecordSymbolWithLocation(
jstring jSymbolName, jint jSymbolType,
jint beginLine, jint beginColumn, jint endLine, jint endColumn,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
);
void doRecordSymbolWithLocationAndScope(
jstring jSymbolName, jint jSymbolType,
jint beginLine, jint beginColumn, jint endLine, jint endColumn,
jint scopeBeginLine, jint scopeBeginColumn, jint scopeEndLine, jint scopeEndColumn,
jint jAccess, jint jIsImplicit
jint jAccess, jint jDefinitionKind
);
void doRecordReference(jint jRefType, jstring jReferencedName, jstring jContextName, jint beginLine, jint beginColumn, jint endLine, jint endColumn);
+17
View File
@@ -1252,7 +1252,24 @@ public:
));
}
///////////////////////////////////////////////////////////////////////////////
// test implicit symbols
void test_cxx_parser_finds_builtin_types()
{
std::shared_ptr<TestParserClient> client = parseCode(
"void t1(int v) {}\n"
"void t2(float v) {}\n"
"void t3(double v) {}\n"
"void t4(bool v) {}\n"
);
TS_ASSERT(utility::containsElement<std::string>(client->builtinTypes, "void"));
TS_ASSERT(utility::containsElement<std::string>(client->builtinTypes, "int"));
TS_ASSERT(utility::containsElement<std::string>(client->builtinTypes, "float"));
TS_ASSERT(utility::containsElement<std::string>(client->builtinTypes, "double"));
TS_ASSERT(utility::containsElement<std::string>(client->builtinTypes, "bool"));
}
///////////////////////////////////////////////////////////////////////////////
// test finding usages of symbols
+6 -3
View File
@@ -17,7 +17,7 @@ public:
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolKind,
AccessKind access, DefinitionType definitionType)
AccessKind access, DefinitionKind definitionKind)
{
std::vector<std::string>* bin = getBinForSymbolKind(symbolKind);
if (bin != nullptr)
@@ -30,7 +30,7 @@ public:
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolKind,
const ParseLocation& location,
AccessKind access, DefinitionType definitionType)
AccessKind access, DefinitionKind definitionKind)
{
std::vector<std::string>* bin = getBinForSymbolKind(symbolKind);
if (bin != nullptr)
@@ -43,7 +43,7 @@ public:
virtual Id recordSymbol(
const NameHierarchy& symbolName, SymbolKind symbolKind,
const ParseLocation& location, const ParseLocation& scopeLocation,
AccessKind access, DefinitionType definitionType)
AccessKind access, DefinitionKind definitionKind)
{
std::vector<std::string>* bin = getBinForSymbolKind(symbolKind);
if (bin != nullptr)
@@ -134,6 +134,7 @@ public:
std::vector<std::string> packages;
std::vector<std::string> typedefs;
std::vector<std::string> builtinTypes;
std::vector<std::string> classes;
std::vector<std::string> interfaces;
std::vector<std::string> enums;
@@ -174,6 +175,8 @@ private:
return &packages;
case SYMBOL_TYPEDEF:
return &typedefs;
case SYMBOL_BUILTIN_TYPE:
return &builtinTypes;
case SYMBOL_CLASS:
return &classes;
case SYMBOL_INTERFACE: