logic: add type information of variable decl to name hierarchy
* implemented this feature for both, CXX and Java * adjusted tests to reflect these changes * added NameElement and NameHierarchy to Java code * created more specialized JavaDeclName classes: JavaFunctionDeclName and JavaVariableDeclName * implemented recording static modifier for Java methods and variables fortune cookie message = You will enjoy true success in whatever you do.
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class JavaDeclName
|
||||
{
|
||||
private JavaDeclName m_parent = null;
|
||||
private String m_name = "";
|
||||
private List<String> m_typeParameterNames = null;
|
||||
|
||||
public static JavaDeclName fromDotSeparatedString(String s)
|
||||
{
|
||||
|
||||
JavaDeclName declName = null;
|
||||
|
||||
int separatorIndex = s.lastIndexOf('.');
|
||||
if (separatorIndex != -1)
|
||||
{
|
||||
declName = new JavaDeclName(s.substring(separatorIndex + 1));
|
||||
declName.setParent(JavaDeclName.fromDotSeparatedString(s.substring(0, separatorIndex)));
|
||||
}
|
||||
else
|
||||
{
|
||||
declName = new JavaDeclName(s, null);
|
||||
}
|
||||
|
||||
return declName;
|
||||
}
|
||||
|
||||
public JavaDeclName(String name)
|
||||
{
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
public JavaDeclName(String name, List<String> typeParameterNames)
|
||||
{
|
||||
m_name = name;
|
||||
m_typeParameterNames = typeParameterNames;
|
||||
}
|
||||
|
||||
public void setParent(JavaDeclName parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
}
|
||||
|
||||
public JavaDeclName getParent()
|
||||
{
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
NameHierarchy nameHierarchy;
|
||||
|
||||
if (m_parent != null)
|
||||
{
|
||||
nameHierarchy = m_parent.toNameHierarchy();
|
||||
}
|
||||
else
|
||||
{
|
||||
nameHierarchy = new NameHierarchy();
|
||||
}
|
||||
|
||||
nameHierarchy.push(new NameElement(m_name + getTypeParameterString()));
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
String string = "";
|
||||
if (m_parent != null)
|
||||
{
|
||||
string = m_parent.toString();
|
||||
string += ".";
|
||||
}
|
||||
|
||||
string += m_name;
|
||||
string += getTypeParameterString();
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
public String getTypeParameterString()
|
||||
{
|
||||
String string = "";
|
||||
if (m_typeParameterNames != null && !m_typeParameterNames.isEmpty())
|
||||
{
|
||||
string += "<";
|
||||
for (int i = 0; i < m_typeParameterNames.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
string += ", ";
|
||||
}
|
||||
string += m_typeParameterNames.get(i);
|
||||
}
|
||||
string += ">";
|
||||
}
|
||||
return string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class JavaFunctionDeclName extends JavaDeclName
|
||||
{
|
||||
private JavaTypeName m_returnTypeName = null;
|
||||
private List<JavaTypeName> m_parameterNames = null;
|
||||
private boolean m_isStatic = false;
|
||||
|
||||
public JavaFunctionDeclName(String name, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames, boolean isStatic)
|
||||
{
|
||||
super(name);
|
||||
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
public JavaFunctionDeclName(String name, List<String> typeParameterNames, JavaTypeName returnTypeName, List<JavaTypeName> parameterNames, boolean isStatic)
|
||||
{
|
||||
super(name, typeParameterNames);
|
||||
|
||||
m_returnTypeName = returnTypeName;
|
||||
m_parameterNames = parameterNames;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String prefix = "";
|
||||
if (m_isStatic)
|
||||
{
|
||||
prefix += "static ";
|
||||
}
|
||||
if (m_returnTypeName != null)
|
||||
{
|
||||
prefix += m_returnTypeName.toString();
|
||||
}
|
||||
|
||||
String postfix = getParameterString();
|
||||
|
||||
NameHierarchy nameHierarchy = super.toNameHierarchy();
|
||||
|
||||
Optional<NameElement> nameElement = nameHierarchy.peek();
|
||||
if (nameElement.isPresent())
|
||||
{
|
||||
String name = nameElement.get().getName();
|
||||
|
||||
nameHierarchy.pop();
|
||||
nameHierarchy.push(new NameElement(name, prefix, postfix));
|
||||
}
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
private String getParameterString()
|
||||
{
|
||||
String string = "(";
|
||||
if (m_parameterNames != null)
|
||||
{
|
||||
for (int i = 0; i < m_parameterNames.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
string += ", ";
|
||||
}
|
||||
string += m_parameterNames.get(i).toString();
|
||||
}
|
||||
}
|
||||
string += ")";
|
||||
return string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class JavaTypeName
|
||||
{
|
||||
private JavaDeclName m_parent = null;
|
||||
private String m_name = "";
|
||||
private List<JavaTypeName> m_typeArgumentNames = null;
|
||||
|
||||
public static JavaTypeName fromDotSeparatedString(String s)
|
||||
{
|
||||
JavaTypeName typeName = null;
|
||||
|
||||
int separatorIndex = s.lastIndexOf('.');
|
||||
if (separatorIndex != -1)
|
||||
{
|
||||
typeName = new JavaTypeName(s.substring(separatorIndex + 1), JavaDeclName.fromDotSeparatedString(s.substring(0, separatorIndex)));
|
||||
}
|
||||
else
|
||||
{
|
||||
typeName = new JavaTypeName(s, null);
|
||||
}
|
||||
|
||||
return typeName;
|
||||
}
|
||||
|
||||
public JavaTypeName(String name, JavaDeclName parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
m_name = name;
|
||||
}
|
||||
|
||||
public JavaTypeName(String name, List<JavaTypeName> typeArgumentNames, JavaDeclName parent)
|
||||
{
|
||||
m_parent = parent;
|
||||
m_name = name;
|
||||
m_typeArgumentNames = typeArgumentNames;
|
||||
}
|
||||
|
||||
public JavaDeclName getParent()
|
||||
{
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
NameHierarchy nameHierarchy;
|
||||
|
||||
if (m_parent != null)
|
||||
{
|
||||
nameHierarchy = m_parent.toNameHierarchy();
|
||||
}
|
||||
else
|
||||
{
|
||||
nameHierarchy = new NameHierarchy();
|
||||
}
|
||||
|
||||
nameHierarchy.push(new NameElement(m_name + getTypeArgumentString()));
|
||||
|
||||
return nameHierarchy;
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
String string = "";
|
||||
if (m_parent != null)
|
||||
{
|
||||
string = m_parent.toString();
|
||||
string += ".";
|
||||
}
|
||||
|
||||
string += m_name;
|
||||
string += getTypeArgumentString();
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
private String getTypeArgumentString()
|
||||
{
|
||||
String string = "";
|
||||
if (m_typeArgumentNames != null && !m_typeArgumentNames.isEmpty())
|
||||
{
|
||||
string += "<";
|
||||
for (int i = 0; i < m_typeArgumentNames.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
string += ", ";
|
||||
}
|
||||
string += m_typeArgumentNames.get(i).toString();
|
||||
}
|
||||
string += ">";
|
||||
}
|
||||
return string;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public class JavaVariableDeclName extends JavaDeclName
|
||||
{
|
||||
private JavaTypeName m_typeName = null;
|
||||
private boolean m_isStatic = false;
|
||||
|
||||
public JavaVariableDeclName(String name, JavaTypeName typeName, boolean isStatic)
|
||||
{
|
||||
super(name);
|
||||
|
||||
m_typeName = typeName;
|
||||
m_isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NameHierarchy toNameHierarchy()
|
||||
{
|
||||
String prefix = "";
|
||||
if (m_isStatic)
|
||||
{
|
||||
prefix += "static ";
|
||||
}
|
||||
if (m_typeName != null)
|
||||
{
|
||||
prefix += m_typeName.toString();
|
||||
}
|
||||
|
||||
NameHierarchy nameHierarchy = super.toNameHierarchy();
|
||||
Optional<NameElement> nameElement = nameHierarchy.peek();
|
||||
if (nameElement.isPresent())
|
||||
{
|
||||
String name = nameElement.get().getName();
|
||||
|
||||
nameHierarchy.pop();
|
||||
nameHierarchy.push(new NameElement(name, prefix, ""));
|
||||
}
|
||||
return nameHierarchy;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
public class NameElement
|
||||
{
|
||||
private String m_name = "";
|
||||
private String m_prefix = "";
|
||||
private String m_postfix = "";
|
||||
|
||||
|
||||
public NameElement(String name)
|
||||
{
|
||||
if (name != null) m_name = name;
|
||||
}
|
||||
|
||||
public NameElement(String name, String prefix, String postfix)
|
||||
{
|
||||
if (name != null) m_name = name;
|
||||
if (prefix != null) m_prefix = prefix;
|
||||
if (postfix != null) m_postfix = postfix;
|
||||
}
|
||||
|
||||
String getName()
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
String getNameWithSignature()
|
||||
{
|
||||
String nameWithSignature = m_name;
|
||||
|
||||
if (m_prefix.length() > 0 || m_postfix.length() > 0)
|
||||
{
|
||||
nameWithSignature = m_prefix;
|
||||
if (!m_name.isEmpty())
|
||||
{
|
||||
if (!m_prefix.isEmpty())
|
||||
{
|
||||
nameWithSignature += " ";
|
||||
}
|
||||
nameWithSignature += m_name;
|
||||
}
|
||||
nameWithSignature += m_postfix;
|
||||
}
|
||||
|
||||
return nameWithSignature;
|
||||
}
|
||||
|
||||
String serialize()
|
||||
{
|
||||
return m_name + "\ts" + m_prefix + "\tp" + m_postfix;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
package com.sourcetrail.name;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
public class NameHierarchy
|
||||
{
|
||||
private List<NameElement> m_elements = new ArrayList<>();
|
||||
|
||||
public NameHierarchy()
|
||||
{
|
||||
}
|
||||
|
||||
public NameHierarchy(String name)
|
||||
{
|
||||
m_elements.add(new NameElement(name));
|
||||
}
|
||||
|
||||
public NameHierarchy(NameElement name)
|
||||
{
|
||||
m_elements.add(name);
|
||||
}
|
||||
|
||||
public NameHierarchy(List<NameElement> names)
|
||||
{
|
||||
m_elements.addAll(names);
|
||||
}
|
||||
|
||||
public void push(NameElement element)
|
||||
{
|
||||
m_elements.add(element);
|
||||
}
|
||||
|
||||
public void pop()
|
||||
{
|
||||
if (!m_elements.isEmpty())
|
||||
{
|
||||
m_elements.remove(m_elements.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<NameElement> peek()
|
||||
{
|
||||
if (!m_elements.isEmpty())
|
||||
{
|
||||
return Optional.of(m_elements.get(m_elements.size() - 1));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public String serialize()
|
||||
{
|
||||
String serialized = ".\tm";
|
||||
|
||||
for (int i = 0; i < m_elements.size(); i++)
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
serialized += "\tn";
|
||||
}
|
||||
|
||||
serialized += m_elements.get(i).serialize();
|
||||
}
|
||||
|
||||
return serialized;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user