Commit 5726af18 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

+ improved formatting (a bit of a hack, needs cleanup)

parent 5554057e
Loading
Loading
Loading
Loading
+86 −4
Original line number Diff line number Diff line
@@ -7,17 +7,27 @@ import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.formatting2.AbstractJavaFormatter;
import org.eclipse.xtext.formatting2.FormatterPreferenceKeys;
import org.eclipse.xtext.formatting2.IFormattableDocument;
import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion;
import org.eclipse.xtext.preferences.ITypedPreferenceValues;
import org.eclipse.xtext.preferences.MapBasedPreferenceValues;
import org.eclipse.xtext.xbase.lib.Extension;
import org.etsi.mts.tdl.Annotation;
import org.etsi.mts.tdl.Comment;
import org.etsi.mts.tdl.ElementImport;
import org.etsi.mts.tdl.FormalParameter;
import org.etsi.mts.tdl.Member;
import org.etsi.mts.tdl.Action;
import org.etsi.mts.tdl.NamedElement;
import org.etsi.mts.tdl.Element;
import org.etsi.mts.tdl.MemberAssignment;
import org.etsi.mts.tdl.PackageableElement;
import org.etsi.mts.tdl.Parameter;
import org.etsi.mts.tdl.ParameterMapping;
import org.etsi.mts.tdl.StructuredDataInstance;
import org.etsi.mts.tdl.StructuredDataType;
import org.etsi.mts.tdl.Connection;
import org.etsi.mts.tdl.TestObjective;
import org.etsi.mts.tdl.services.TDLtxGrammarAccess;

@@ -32,6 +42,10 @@ public class TDLtxFormatter extends AbstractJavaFormatter {
	//TODO: it does not work with white-space delimiters
	protected void formatCustom(Element e, IFormattableDocument doc) {
		doc.prepend(e, p -> p.setNewLines(1));
		//TODO: repeated formatting doesn't work very well..

	    doc.prepend(this.textRegionExtensions.allRegionsFor(e).keyword(","), r->r.noSpace());

		List<ISemanticRegion> rbs = this.textRegionExtensions.regionFor(e).ruleCallsTo(this._grammarAccess.getBEGINRule());
		List<ISemanticRegion> res = this.textRegionExtensions.regionFor(e).ruleCallsTo(this._grammarAccess.getENDRule());
//		System.out.println(res.size());
@@ -51,8 +65,13 @@ public class TDLtxFormatter extends AbstractJavaFormatter {
	}
	
	protected void format(org.etsi.mts.tdl.NamedElement e, IFormattableDocument doc) {
//		System.out.println("Formatting: "+e.getName() + " : "+e.eClass().getName());
//		doc.interior(e, p->p.indent());
		formatCustom(e, doc);
		if (e instanceof FormalParameter) {
//			doc.surround(e, p->p.indent());
//			doc.prepend(e, p->p.setNewLines(0));
		}

		for (Comment comment : e.getComment()) {
			doc.surround(comment, p -> p.setNewLines(1));
@@ -69,9 +88,14 @@ public class TDLtxFormatter extends AbstractJavaFormatter {
					|| c instanceof MemberAssignment
					|| c instanceof ParameterMapping
					|| c instanceof Comment
					|| c instanceof Connection
					) {
				doc.surround(c, p->p.setNewLines(1));
				//TODO: re-enable in select contexts?
				//doc.surround(c, p->p.setNewLines(1));
			    doc.prepend(this.textRegionExtensions.allRegionsFor(e).keyword(","), r->r.noSpace());

				formatCustom((Element)c, doc);
				doc.format(c);
			}
		}
		if (e instanceof TestObjective) {
@@ -80,17 +104,75 @@ public class TDLtxFormatter extends AbstractJavaFormatter {
				doc.append(rs, p -> p.setNewLines(1));
			}
		}
		if (e instanceof Action) {
			int size = ((Action)e).getFormalParameter().size();
			int i = 0;

			for (FormalParameter m :((Action) e).getFormalParameter()) {
				i++;
				doc.prepend(m, r->r.newLine());
				doc.surround(m, p->p.indent());

				if (i==size) {
					doc.append(m, p->p.newLine());
				}
				doc.format(m);
			}
		}
		if (e instanceof StructuredDataType) {
			if (!((StructuredDataType) e).getMember().isEmpty()) {
				doc.interior(
						doc.append(this.textRegionExtensions.regionFor(e).keyword("("), r->r.newLine()), 
						doc.prepend(this.textRegionExtensions.regionFor(e).keyword(")"), r->r.newLine()), 
						r->r.indent());
			}
			int size = ((StructuredDataType)e).getMember().size();
			int i = 0;

			for (Member m :((StructuredDataType) e).getMember()) {
				i++;
				doc.prepend(m, r->r.newLine());
				doc.surround(m, p->p.indent());

				if (i==size) {
					doc.append(m, p->p.newLine());
				}
				doc.format(m);
			}
		}

		if (e instanceof StructuredDataInstance) {
			int size = ((StructuredDataInstance)e).getMemberAssignment().size();
			int i = 0;
			for (MemberAssignment m : ((StructuredDataInstance)e).getMemberAssignment()) {
				i++;
				doc.prepend(m, p->p.newLine());
				doc.surround(m, p->p.indent());
//				doc.append(m, p->p.newLine());
				if (i==size) {
					doc.append(m, p->p.newLine());
				}
				doc.format(m);
			}
		}

	}

	protected void format(org.etsi.mts.tdl.Package _package, IFormattableDocument doc) {
		// TODO: format HiddenRegions around keywords, attributes, cross references,
		// etc.
//		getPreferences().getPreference(FormatterPreferenceKeys.indentation);
		//setPreference(FormatterPreferenceKeys.indentation);
		if (getPreferences() instanceof MapBasedPreferenceValues) {
			MapBasedPreferenceValues preferences = (MapBasedPreferenceValues) getPreferences();
			preferences.put(FormatterPreferenceKeys.indentation, "    ");
		}
		
//		Formatter
		org.etsi.mts.tdl.Package e = _package;
		formatCustom(e, doc);
		
		List<ISemanticRegion> dots = this.textRegionExtensions.allRegionsFor(e).keywords(".", "@");
		List<ISemanticRegion> dots = this.textRegionExtensions.allRegionsFor(e).keywords(".", "@", ",");
		for (ISemanticRegion dot : dots) {
			doc.surround(dot, p -> p.noSpace());
		}
+36 −7
Original line number Diff line number Diff line
@@ -7,9 +7,11 @@ import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.formatting2.FormatterPreferenceKeys;
import org.eclipse.xtext.formatting2.IFormattableDocument;
import org.eclipse.xtext.formatting2.IHiddenRegionFormatter;
import org.eclipse.xtext.formatting2.regionaccess.ISemanticRegion;
import org.eclipse.xtext.preferences.MapBasedPreferenceValues;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.etsi.mts.tdl.Element;
import org.etsi.mts.tdl.ElementImport;
@@ -22,6 +24,7 @@ import org.etsi.mts.tdl.TimeLabel;
import org.etsi.mts.tdl.tdlPackage;
import org.etsi.mts.tdl.TimeConstraint;
import org.etsi.mts.tdl.ComponentType;
import org.etsi.mts.tdl.Connection;
import org.etsi.mts.tdl.Annotation;
import org.etsi.mts.tdl.Extension;
import org.etsi.mts.tdl.DataElementMapping;
@@ -90,7 +93,9 @@ public class TDLtxiFormatter extends TDLtxFormatter {
				doc.append(f, p->p.newLine());
			}
		}

		if (e instanceof Connection) {
			doc.prepend(e, p->p.newLine());
		}
		
		
		for (EObject m : e.eContents()) {
@@ -114,7 +119,7 @@ public class TDLtxiFormatter extends TDLtxFormatter {

	
	@Override protected void format(org.etsi.mts.tdl.NamedElement e, IFormattableDocument doc) {
		doc.surround(e, p->p.newLine());
		doc.prepend(e, p->p.newLine());
//		doc.interior(e, p->p.indent());
//		doc.format(e);
//		doc.interior(e, p->p.indent());
@@ -126,18 +131,36 @@ public class TDLtxiFormatter extends TDLtxFormatter {
//			doc.append(open.get(0), p->p.newLine());
//			doc.interior(open.get(0), close.get(0), p->p.indent());

			if (!((StructuredDataType) e).getMember().isEmpty()) {
//				doc.interior(
//						doc.append(this.textRegionExtensions.regionFor(e).keyword("("), r->r.newLine()), 
//						doc.prepend(this.textRegionExtensions.regionFor(e).keyword(")"), r->r.newLine()), 
//						r->r.indent());
			}
			int size = ((StructuredDataType)e).getMember().size();
			int i = 0;
			for (Member m : ((StructuredDataType)e).getMember()) {
				i++;
				doc.prepend(m, p->p.newLine());
				doc.surround(m, p->p.indent());
				if (i==size) {
					doc.append(m, p->p.newLine());
				}
				doc.format(m);
			}
		}

		if (e instanceof StructuredDataInstance) {
			int size = ((StructuredDataInstance)e).getMemberAssignment().size();
			int i = 0;
			for (MemberAssignment m : ((StructuredDataInstance)e).getMemberAssignment()) {
				i++;
				doc.prepend(m, p->p.newLine());
				doc.surround(m, p->p.indent());
//				doc.append(m, p->p.newLine());
				if (i==size) {
					doc.append(m, p->p.newLine());
				}
				doc.format(m);
			}
		}
@@ -201,10 +224,16 @@ public class TDLtxiFormatter extends TDLtxFormatter {

	@Override protected void format(org.etsi.mts.tdl.Package _package, IFormattableDocument doc) {
		// TODO: format HiddenRegions around keywords, attributes, cross references, etc.
		if (getPreferences() instanceof MapBasedPreferenceValues) {
			MapBasedPreferenceValues preferences = (MapBasedPreferenceValues) getPreferences();
			preferences.put(FormatterPreferenceKeys.indentation, "    ");
		}
		//TODO: repeated formatting doesn't work very well..
		
		doc.interior(_package, p->p.indent());

		Package e = _package;
		List<ISemanticRegion> dots = this.textRegionExtensions.allRegionsFor(e).keywords(".", "@");
		List<ISemanticRegion> dots = this.textRegionExtensions.allRegionsFor(e).keywords(".", "@", ",");
		for (ISemanticRegion dot : dots) {
			doc.surround(dot, p -> p.noSpace());
		}