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
No related branches found
No related tags found
No related merge requests found
......@@ -4,14 +4,26 @@ aspect XMIPathConstruction {
syn String EModelElement.xmiReference() = xmiPath() + localName();
eq EDataType.xmiReference() {
if (getParent() == null) {
switch (getName()) {
case "EInt":
return "ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt";
case "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:
throw new RuntimeException("Unable to create reference to EDataType " + getName());
}
} else {
return super.xmiReference();
}
}
inh String EModelElement.xmiPath();
......@@ -56,7 +68,7 @@ aspect XMIPathConstruction {
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.getEParameter(int i).localRelativeName() = "/@eParameters." + i;
......
aspect XMIPathResolution {
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) {
......@@ -12,6 +14,14 @@ aspect XMIPathResolution {
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;
public static final EDataType EDataType.eInt() {
if (eInt == null) {
......@@ -32,6 +42,46 @@ aspect XMIPathResolution {
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) {
// built-in data types
......@@ -41,6 +91,14 @@ aspect XMIPathResolution {
return EDataType.eInt();
case "http://www.eclipse.org/emf/2002/Ecore#//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:
throw new RuntimeException("Unable to resolve built-in data type '" + uriString + "'");
}
......
......@@ -19,7 +19,11 @@ aspect XMIWriter {
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
" xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\"");
} 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 {
eTypeParameter.writeXMI(b, "eTypeParameters", indentationLevel + 1);
}
// from EClass
for (EStructuralFeature eStructuralFeature : getEStructuralFeatureList()) {
eStructuralFeature.writeXMI(b, "eStructuralFeatures", indentationLevel + 1);
}
for (EOperation eOperation : getEOperationList()) {
eOperation.writeXMI(b, "eOperations", indentationLevel + 1);
}
for (EStructuralFeature eStructuralFeature : getEStructuralFeatureList()) {
eStructuralFeature.writeXMI(b, "eStructuralFeatures", indentationLevel + 1);
}
for (EGenericType eGenericSuperType : getEGenericSuperTypeList()) {
eGenericSuperType.writeXMI(b, "eGenericSuperTypes", indentationLevel + 1);
}
......@@ -132,13 +136,30 @@ aspect XMIWriter {
startXMIElement(b, "ecore:EDataType", context);
// attributes
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) {
b.append("/>\n");
return;
}
b.append(">\n");
// 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
b.append(indentString(indentationLevel)).append("</");
......@@ -147,13 +168,139 @@ aspect XMIWriter {
}
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) {
// 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);
void EReference.writeXMI(StringBuilder b, String context, int indentationLevel) {
......@@ -175,7 +322,9 @@ aspect XMIWriter {
if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\"");
}
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EStructuralFEature
if (getChangeable() == false) {
b.append(" changeable=\"false\"");
......@@ -205,21 +354,20 @@ aspect XMIWriter {
if (hasEOpposite()) {
b.append(" eOpposite=\"").append(getEOpposite().xmiReference()).append("\"");
}
if (getNumChild() == 0) {
b.append("/>\n");
return;
}
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
}
System.out.println(numContainedChildren());
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("</");
......@@ -246,7 +394,9 @@ aspect XMIWriter {
if (getUpperBound() != 1) {
b.append(" upperBound=\"" + getUpperBound() + "\"");
}
if (hasEType()) {
b.append(" eType=\"").append(getEType().xmiReference()).append("\"");
}
// from EStructuralFEature
if (getChangeable() == false) {
b.append(" changeable=\"false\"");
......@@ -270,10 +420,6 @@ aspect XMIWriter {
if (getID() == true) {
b.append(" iD=\"true\"");
}
if (getNumChild() == 0) {
b.append("/>\n");
return;
}
if (numContainedChildren() == 0) {
b.append("/>\n");
return;
......@@ -284,6 +430,10 @@ aspect XMIWriter {
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("</");
......@@ -292,10 +442,61 @@ aspect XMIWriter {
}
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) {
// 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>;
abstract ETypedElement : ENamedElement ::= [EGenericType] <Ordered:boolean> <Unique:boolean> <LowerBound:int> <UpperBound:int>;
EClass : EClassifier ::= EStructuralFeature* EOperation* EGenericSuperType:EGenericType* <Abstract:boolean> <Interface:boolean>;
EDataType : EClassifier;
EDataType : EClassifier ::= <Serializable:boolean>;
EEnum : EDataType ::= ELiteral:EEnumLiteral*;
abstract EStructuralFeature : ETypedElement ::= <Changeable:boolean> <Volatile:boolean> <Transient:boolean> <DefaultValueLiteral:String> <Unsettable:boolean> <Derived:boolean>;
EAttribute : EStructuralFeature ::= <ID:boolean>;
EReference : EStructuralFeature ::= <Containment:boolean> <ResolveProxies:boolean>;
EOperation : ETypedElement ::= GenericException:EGenericType* ETypeParameter* EParameter*;
EOperation : ETypedElement ::= EGenericException:EGenericType* ETypeParameter* EParameter*;
EParameter : ETypedElement;
EStringToStringMapEntry ::= <Key:String> <Value:String>;
......@@ -29,14 +29,12 @@ EStringToStringMapEntry ::= <Key:String> <Value:String>;
ETypeParameter : ENamedElement ::= EBound:EGenericType*;
EGenericType ::= [EUpperBound:EGenericType] [ELowerBound:EGenericType] ETypeArgument:EGenericType*;
rel ETypedElement.EType -> EClassifier;
rel ETypedElement.EType? -> EClassifier;
rel EOperation.EExceptions* -> EClassifier;
rel EClass.ESuperTypes* -> EClass;
rel EReference.EOpposite? -> EReference;
rel EAnnotation.References* -> EObject;
rel ETypeParameter.GenericTypes* <-> EGenericType.ETypeParameter?;
rel EGenericType.ETypeParameter? -> ETypeParameter;
rel EGenericType.EClassifier? -> EClassifier;
// 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