Skip to content
Snippets Groups Projects
Commit 07d647c8 authored by Johannes Mey's avatar Johannes Mey
Browse files

further work on parser, printer and some fixes for grammar

parent ff5fae06
Branches
No related tags found
No related merge requests found
...@@ -4,14 +4,26 @@ aspect XMIPathConstruction { ...@@ -4,14 +4,26 @@ aspect XMIPathConstruction {
syn String EModelElement.xmiReference() = xmiPath() + localName(); syn String EModelElement.xmiReference() = xmiPath() + localName();
eq EDataType.xmiReference() { eq EDataType.xmiReference() {
if (getParent() == null) {
switch (getName()) { switch (getName()) {
case "EInt": case "EInt":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"; return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt";
case "EString": case "EString":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"; return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString";
case "EBoolean":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean";
case "EJavaObject":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject";
case "EEnumerator":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EEnumerator";
case "EResource":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EResource";
default: default:
throw new RuntimeException("Unable to create reference to EDataType " + getName()); throw new RuntimeException("Unable to create reference to EDataType " + getName());
} }
} else {
return super.xmiReference();
}
} }
inh String EModelElement.xmiPath(); inh String EModelElement.xmiPath();
...@@ -56,7 +68,7 @@ aspect XMIPathConstruction { ...@@ -56,7 +68,7 @@ aspect XMIPathConstruction {
eq EEnum.getELiteral(int i).localRelativeName() = "/@eLiterals." + i; eq EEnum.getELiteral(int i).localRelativeName() = "/@eLiterals." + i;
eq EOperation.getGenericException(int i).localRelativeName() = "/@eGenericExceptions." + i; eq EOperation.getEGenericException(int i).localRelativeName() = "/@eGenericExceptions." + i;
eq EOperation.getETypeParameter(int i).localRelativeName() = "/@eTypeParameters." + i; eq EOperation.getETypeParameter(int i).localRelativeName() = "/@eTypeParameters." + i;
eq EOperation.getEParameter(int i).localRelativeName() = "/@eParameters." + i; eq EOperation.getEParameter(int i).localRelativeName() = "/@eParameters." + i;
......
aspect XMIPathResolution { aspect XMIPathResolution {
refine RefResolverStubs eq ETypedElement.resolveETypeByToken(String id) { refine RefResolverStubs eq ETypedElement.resolveETypeByToken(String id) {
return (EClassifier) resolve(id);
EClassifier result = (EClassifier) resolve(id);
return result;
} }
refine RefResolverStubs eq EReference.resolveEOppositeByToken(String id) { refine RefResolverStubs eq EReference.resolveEOppositeByToken(String id) {
...@@ -12,6 +14,14 @@ aspect XMIPathResolution { ...@@ -12,6 +14,14 @@ aspect XMIPathResolution {
return (EClass) resolve(id); return (EClass) resolve(id);
} }
refine RefResolverStubs eq EGenericType.resolveEClassifierByToken(String id) {
return (EClassifier) resolve(id);
}
refine RefResolverStubs eq EOperation.resolveEExceptionsByToken(String id, int position) {
return (EClassifier) resolve(id);
}
private static EDataType EDataType.eInt; private static EDataType EDataType.eInt;
public static final EDataType EDataType.eInt() { public static final EDataType EDataType.eInt() {
if (eInt == null) { if (eInt == null) {
...@@ -32,6 +42,46 @@ aspect XMIPathResolution { ...@@ -32,6 +42,46 @@ aspect XMIPathResolution {
return eString; return eString;
} }
private static EDataType EDataType.eBoolean;
public static final EDataType EDataType.eBoolean() {
if (eBoolean == null) {
eBoolean = new EDataType();
eBoolean.setInstanceClassName("boolean");
eBoolean.setName("EBoolean");
}
return eBoolean;
}
private static EDataType EDataType.eJavaObject;
public static final EDataType EDataType.eJavaObject() {
if (eJavaObject == null) {
eJavaObject = new EDataType();
eJavaObject.setInstanceClassName("java.lang.Object");
eJavaObject.setName("EJavaObject");
}
return eBoolean;
}
private static EDataType EDataType.eEnumerator;
public static final EDataType EDataType.eEnumerator() {
if (eEnumerator == null) {
eEnumerator = new EDataType();
eEnumerator.setInstanceClassName("org.eclipse.emf.common.util.Enumerator");
eEnumerator.setName("EEnumerator");
}
return eBoolean;
}
private static EDataType EDataType.eResource;
public static final EDataType EDataType.eResource() {
if (eResource == null) {
eResource = new EDataType();
eResource.setInstanceClassName("org.eclipse.emf.ecore.resource.Resource");
eResource.setName("EResource");
}
return eResource;
}
syn ASTNode ASTNode.resolve(String uriString) { syn ASTNode ASTNode.resolve(String uriString) {
// built-in data types // built-in data types
...@@ -41,6 +91,14 @@ aspect XMIPathResolution { ...@@ -41,6 +91,14 @@ aspect XMIPathResolution {
return EDataType.eInt(); return EDataType.eInt();
case "http://www.eclipse.org/emf/2002/Ecore#//EString": case "http://www.eclipse.org/emf/2002/Ecore#//EString":
return EDataType.eString(); return EDataType.eString();
case "http://www.eclipse.org/emf/2002/Ecore#//EBoolean":
return EDataType.eBoolean();
case "http://www.eclipse.org/emf/2002/Ecore#//EJavaObject":
return EDataType.eJavaObject();
case "http://www.eclipse.org/emf/2002/Ecore#//EEnumerator":
return EDataType.eEnumerator();
case "http://www.eclipse.org/emf/2002/Ecore#//EResource":
return EDataType.eResource();
default: default:
throw new RuntimeException("Unable to resolve built-in data type '" + uriString + "'"); throw new RuntimeException("Unable to resolve built-in data type '" + uriString + "'");
} }
......
...@@ -19,7 +19,11 @@ aspect XMIWriter { ...@@ -19,7 +19,11 @@ aspect XMIWriter {
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\""); " xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\"");
} else { } else {
b.append(context).append(" xsi:type=\"").append(type).append("\""); b.append(context);
if (!"".equals(type)) {
// TODO whether to print the type can be determined by static analysis!
b.append(" xsi:type=\"").append(type).append("\"");
}
} }
} }
...@@ -111,12 +115,12 @@ aspect XMIWriter { ...@@ -111,12 +115,12 @@ aspect XMIWriter {
eTypeParameter.writeXMI(b, "eTypeParameters", indentationLevel + 1); eTypeParameter.writeXMI(b, "eTypeParameters", indentationLevel + 1);
} }
// from EClass // from EClass
for (EStructuralFeature eStructuralFeature : getEStructuralFeatureList()) {
eStructuralFeature.writeXMI(b, "eStructuralFeatures", indentationLevel + 1);
}
for (EOperation eOperation : getEOperationList()) { for (EOperation eOperation : getEOperationList()) {
eOperation.writeXMI(b, "eOperations", indentationLevel + 1); eOperation.writeXMI(b, "eOperations", indentationLevel + 1);
} }
for (EStructuralFeature eStructuralFeature : getEStructuralFeatureList()) {
eStructuralFeature.writeXMI(b, "eStructuralFeatures", indentationLevel + 1);
}
for (EGenericType eGenericSuperType : getEGenericSuperTypeList()) { for (EGenericType eGenericSuperType : getEGenericSuperTypeList()) {
eGenericSuperType.writeXMI(b, "eGenericSuperTypes", indentationLevel + 1); eGenericSuperType.writeXMI(b, "eGenericSuperTypes", indentationLevel + 1);
} }
...@@ -132,13 +136,30 @@ aspect XMIWriter { ...@@ -132,13 +136,30 @@ aspect XMIWriter {
startXMIElement(b, "ecore:EDataType", context); startXMIElement(b, "ecore:EDataType", context);
// attributes // attributes
b.append(" name=\"").append(getName()).append("\""); b.append(" name=\"").append(getName()).append("\"");
// from EClassifier
if (getInstanceClassName() != "") {
b.append(" instanceClassName=\"").append(getInstanceClassName()).append("\"");
}
// from EDataType
if (getSerializable() == false) {
b.append(" serializable=\"false\"");
}
if (numContainedChildren() == 0) { if (numContainedChildren() == 0) {
b.append("/>\n"); b.append("/>\n");
return; return;
} }
b.append(">\n"); b.append(">\n");
// child nodes // child nodes
// from EModelElement
for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
}
// from EClassifier
for (ETypeParameter eTypeParameter : getETypeParameterList()) {
eTypeParameter.writeXMI(b, "eTypeParameters", indentationLevel + 1);
}
// closing tag // closing tag
b.append(indentString(indentationLevel)).append("</"); b.append(indentString(indentationLevel)).append("</");
...@@ -147,13 +168,139 @@ aspect XMIWriter { ...@@ -147,13 +168,139 @@ aspect XMIWriter {
} }
void EGenericType.writeXMI(StringBuilder b, String context, int indentationLevel) { void EGenericType.writeXMI(StringBuilder b, String context, int indentationLevel) {
// TODO implement b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
if (hasETypeParameter()) {
b.append(" eTypeParameter=\"").append(getETypeParameter().xmiReference()).append("\"");
}
if (hasEClassifier()) {
b.append(" eClassifier=\"").append(getEClassifier().xmiReference()).append("\"");
}
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
b.append(">\n");
// child nodes
// from EGenericType
if (hasEUpperBound()) {
getEUpperBound().writeXMI(b, "eUpperBound", indentationLevel + 1);
}
if (hasELowerBound()) {
getELowerBound().writeXMI(b, "eLowerBound", indentationLevel + 1);
}
for (EGenericType eTypeArgument : getETypeArgumentList()) {
eTypeArgument.writeXMI(b, "eTypeArguments", indentationLevel + 1);
}
// closing tag
b.append(indentString(indentationLevel)).append("</");
endXMIElement(b, "", context);
b.append(">\n");
} }
void EOperation.writeXMI(StringBuilder b, String context, int indentationLevel) { void EOperation.writeXMI(StringBuilder b, String context, int indentationLevel) {
// TODO implement b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
// from ENamedElement
b.append(" name=\"").append(getName()).append("\"");
// from ETypedElement
if (getOrdered() == false) {
b.append(" ordered=\"false\"");
}
if (getUnique() == false) {
b.append(" unique=\"false\"");
}
if (getLowerBound() != 0) {
b.append(" lowerBound=\"" + getLowerBound() + "\"");
}
if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\"");
}
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EOperation
for (EClassifier eException : getEExceptionsList()) {
b.append(" eExceptions=\"").append(eException.xmiReference()).append("\"");
}
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
b.append(">\n");
// child nodes
// from EModelElement
for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
}
// from ETypedElement
if (hasEGenericType()) {
getEGenericType().writeXMI(b, "eGenericType", indentationLevel + 1);
}
// from EOperation
for (EGenericType eGenericException : getEGenericExceptionList()) {
eGenericException.writeXMI(b, "eGenericExceptions", indentationLevel + 1);
}
for (ETypeParameter eTypeParameter : getETypeParameterList()) {
eTypeParameter.writeXMI(b, "eTypeParameters", indentationLevel + 1);
}
for (EParameter eParameter : getEParameterList()) {
eParameter.writeXMI(b, "eParameters", indentationLevel + 1);
} }
// closing tag
b.append(indentString(indentationLevel)).append("</");
endXMIElement(b, "", context);
b.append(">\n");
}
void EParameter.writeXMI(StringBuilder b, String context, int indentationLevel) {
b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
// from ENamedElement
b.append(" name=\"").append(getName()).append("\"");
// from ETypedElement
if (getOrdered() == false) {
b.append(" ordered=\"false\"");
}
if (getUnique() == false) {
b.append(" unique=\"false\"");
}
if (getLowerBound() != 0) {
b.append(" lowerBound=\"" + getLowerBound() + "\"");
}
if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\"");
}
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
b.append(">\n");
// child nodes
// from EModelElement
for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
}
// from ETypedElement
if (hasEGenericType()) {
getEGenericType().writeXMI(b, "eGenericType", indentationLevel + 1);
}
// closing tag
b.append(indentString(indentationLevel)).append("</");
endXMIElement(b, "", context);
b.append(">\n");
}
abstract void EStructuralFeature.writeXMI(StringBuilder b, String context, int indentationLevel); abstract void EStructuralFeature.writeXMI(StringBuilder b, String context, int indentationLevel);
void EReference.writeXMI(StringBuilder b, String context, int indentationLevel) { void EReference.writeXMI(StringBuilder b, String context, int indentationLevel) {
...@@ -175,7 +322,9 @@ aspect XMIWriter { ...@@ -175,7 +322,9 @@ aspect XMIWriter {
if (getUpperBound() != 1) { if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\""); b.append(" upperBound=\"" + getUpperBound() + "\"");
} }
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\""); b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EStructuralFEature // from EStructuralFEature
if (getChangeable() == false) { if (getChangeable() == false) {
b.append(" changeable=\"false\""); b.append(" changeable=\"false\"");
...@@ -205,21 +354,20 @@ aspect XMIWriter { ...@@ -205,21 +354,20 @@ aspect XMIWriter {
if (hasEOpposite()) { if (hasEOpposite()) {
b.append(" eOpposite=\"").append(getEOpposite().xmiReference()).append("\""); b.append(" eOpposite=\"").append(getEOpposite().xmiReference()).append("\"");
} }
if (getNumChild() == 0) {
b.append("/>\n");
return;
}
if (numContainedChildren() == 0) { if (numContainedChildren() == 0) {
b.append("/>\n"); b.append("/>\n");
return; return;
} }
System.out.println(numContainedChildren());
b.append(">\n"); b.append(">\n");
// child nodes // child nodes
// from EModelElement // from EModelElement
for (EAnnotation eAnnotation : getEAnnotationList()) { for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1); eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
} }
// from ETypedElement
if (hasEGenericType()) {
getEGenericType().writeXMI(b, "eGenericType", indentationLevel + 1);
}
// closing tag // closing tag
b.append(indentString(indentationLevel)).append("</"); b.append(indentString(indentationLevel)).append("</");
...@@ -246,7 +394,9 @@ aspect XMIWriter { ...@@ -246,7 +394,9 @@ aspect XMIWriter {
if (getUpperBound() != 1) { if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\""); b.append(" upperBound=\"" + getUpperBound() + "\"");
} }
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\""); b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EStructuralFEature // from EStructuralFEature
if (getChangeable() == false) { if (getChangeable() == false) {
b.append(" changeable=\"false\""); b.append(" changeable=\"false\"");
...@@ -270,10 +420,6 @@ aspect XMIWriter { ...@@ -270,10 +420,6 @@ aspect XMIWriter {
if (getID() == true) { if (getID() == true) {
b.append(" iD=\"true\""); b.append(" iD=\"true\"");
} }
if (getNumChild() == 0) {
b.append("/>\n");
return;
}
if (numContainedChildren() == 0) { if (numContainedChildren() == 0) {
b.append("/>\n"); b.append("/>\n");
return; return;
...@@ -284,6 +430,10 @@ aspect XMIWriter { ...@@ -284,6 +430,10 @@ aspect XMIWriter {
for (EAnnotation eAnnotation : getEAnnotationList()) { for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1); eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
} }
// from ETypedElement
if (hasEGenericType()) {
getEGenericType().writeXMI(b, "eGenericType", indentationLevel + 1);
}
// closing tag // closing tag
b.append(indentString(indentationLevel)).append("</"); b.append(indentString(indentationLevel)).append("</");
...@@ -292,10 +442,61 @@ aspect XMIWriter { ...@@ -292,10 +442,61 @@ aspect XMIWriter {
} }
void EAnnotation.writeXMI(StringBuilder b, String context, int indentationLevel) { void EAnnotation.writeXMI(StringBuilder b, String context, int indentationLevel) {
// TODO implement b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
b.append(" source=\"").append(getSource()).append("\"");
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
b.append(">\n");
// child nodes
for (EStringToStringMapEntry detail : getDetailList()) {
detail.writeXMI(b, "details", indentationLevel + 1);
}
// closing tag
b.append(indentString(indentationLevel)).append("</");
endXMIElement(b, "", context);
b.append(">\n");
}
void EStringToStringMapEntry.writeXMI(StringBuilder b, String context, int indentationLevel) {
b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
b.append(" key=\"").append(getKey()).append("\"");
b.append(" value=\"").append(getValue()).append("\"");
b.append("/>\n");
} }
void ETypeParameter.writeXMI(StringBuilder b, String context, int indentationLevel) { void ETypeParameter.writeXMI(StringBuilder b, String context, int indentationLevel) {
// TODO implement b.append(indentString(indentationLevel)).append("<");
startXMIElement(b, "", context);
// attributes
// from ENamedElement
b.append(" name=\"").append(getName()).append("\"");
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
b.append(">\n");
// child nodes
// from EModelElement
for (EAnnotation eAnnotation : getEAnnotationList()) {
eAnnotation.writeXMI(b, "eAnnotations", indentationLevel + 1);
}
// from ETypeParameter
for (EGenericType eGenericType : getEBoundList()) {
eGenericType.writeXMI(b, "eTypeParameters", indentationLevel + 1);
}
// closing tag
b.append(indentString(indentationLevel)).append("</");
endXMIElement(b, "ecore:EPackage", context);
b.append(">\n");
} }
} }
...@@ -15,13 +15,13 @@ EEnumLiteral : ENamedElement ::= <Value:int>; ...@@ -15,13 +15,13 @@ EEnumLiteral : ENamedElement ::= <Value:int>;
abstract ETypedElement : ENamedElement ::= [EGenericType] <Ordered:boolean> <Unique:boolean> <LowerBound:int> <UpperBound:int>; abstract ETypedElement : ENamedElement ::= [EGenericType] <Ordered:boolean> <Unique:boolean> <LowerBound:int> <UpperBound:int>;
EClass : EClassifier ::= EStructuralFeature* EOperation* EGenericSuperType:EGenericType* <Abstract:boolean> <Interface:boolean>; EClass : EClassifier ::= EStructuralFeature* EOperation* EGenericSuperType:EGenericType* <Abstract:boolean> <Interface:boolean>;
EDataType : EClassifier; EDataType : EClassifier ::= <Serializable:boolean>;
EEnum : EDataType ::= ELiteral:EEnumLiteral*; EEnum : EDataType ::= ELiteral:EEnumLiteral*;
abstract EStructuralFeature : ETypedElement ::= <Changeable:boolean> <Volatile:boolean> <Transient:boolean> <DefaultValueLiteral:String> <Unsettable:boolean> <Derived:boolean>; abstract EStructuralFeature : ETypedElement ::= <Changeable:boolean> <Volatile:boolean> <Transient:boolean> <DefaultValueLiteral:String> <Unsettable:boolean> <Derived:boolean>;
EAttribute : EStructuralFeature ::= <ID:boolean>; EAttribute : EStructuralFeature ::= <ID:boolean>;
EReference : EStructuralFeature ::= <Containment:boolean> <ResolveProxies:boolean>; EReference : EStructuralFeature ::= <Containment:boolean> <ResolveProxies:boolean>;
EOperation : ETypedElement ::= GenericException:EGenericType* ETypeParameter* EParameter*; EOperation : ETypedElement ::= EGenericException:EGenericType* ETypeParameter* EParameter*;
EParameter : ETypedElement; EParameter : ETypedElement;
EStringToStringMapEntry ::= <Key:String> <Value:String>; EStringToStringMapEntry ::= <Key:String> <Value:String>;
...@@ -29,14 +29,12 @@ EStringToStringMapEntry ::= <Key:String> <Value:String>; ...@@ -29,14 +29,12 @@ EStringToStringMapEntry ::= <Key:String> <Value:String>;
ETypeParameter : ENamedElement ::= EBound:EGenericType*; ETypeParameter : ENamedElement ::= EBound:EGenericType*;
EGenericType ::= [EUpperBound:EGenericType] [ELowerBound:EGenericType] ETypeArgument:EGenericType*; EGenericType ::= [EUpperBound:EGenericType] [ELowerBound:EGenericType] ETypeArgument:EGenericType*;
rel ETypedElement.EType -> EClassifier; rel ETypedElement.EType? -> EClassifier;
rel EOperation.EExceptions* -> EClassifier; rel EOperation.EExceptions* -> EClassifier;
rel EClass.ESuperTypes* -> EClass; rel EClass.ESuperTypes* -> EClass;
rel EReference.EOpposite? -> EReference; rel EReference.EOpposite? -> EReference;
rel EAnnotation.References* -> EObject; rel EAnnotation.References* -> EObject;
rel ETypeParameter.GenericTypes* <-> EGenericType.ETypeParameter?; rel EGenericType.ETypeParameter? -> ETypeParameter;
rel EGenericType.EClassifier? -> EClassifier; rel EGenericType.EClassifier? -> EClassifier;
// transient stuff (the inverse directions of the containment relations are missing) // transient stuff (the inverse directions of the containment relations are missing)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment