Last active
December 30, 2015 03:39
-
-
Save balazsgrill/7770351 to your computer and use it in GitHub Desktop.
textualmodeler diff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/hu.textualmodeler.editor/META-INF/MANIFEST.MF b/hu.textualmodeler.editor/META-INF/MANIFEST.MF | |
index ffbafd3..e1d1518 100644 | |
--- a/hu.textualmodeler.editor/META-INF/MANIFEST.MF | |
+++ b/hu.textualmodeler.editor/META-INF/MANIFEST.MF | |
@@ -19,7 +19,9 @@ | |
org.eclipse.emf.databinding;bundle-version="1.3.0", | |
org.eclipse.core.databinding.property;bundle-version="1.4.200", | |
org.eclipse.emf.transaction;bundle-version="1.4.0", | |
- org.eclipse.emf.databinding.edit;bundle-version="1.3.0" | |
+ org.eclipse.emf.databinding.edit;bundle-version="1.3.0", | |
+ hu.textualmodeler.edit;bundle-version="1.0.0", | |
+ org.eclipse.emf.edit.ui;bundle-version="2.9.0" | |
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 | |
Bundle-ActivationPolicy: lazy | |
Export-Package: hu.textualmodeler.editor | |
diff --git a/hu.textualmodeler.editor/src/hu/textualmodeler/editor/impl/TextualModelContentOutlinePage.java b/hu.textualmodeler.editor/src/hu/textualmodeler/editor/impl/TextualModelContentOutlinePage.java | |
index 65fd7ea..57d5432 100644 | |
--- a/hu.textualmodeler.editor/src/hu/textualmodeler/editor/impl/TextualModelContentOutlinePage.java | |
+++ b/hu.textualmodeler.editor/src/hu/textualmodeler/editor/impl/TextualModelContentOutlinePage.java | |
@@ -6,17 +6,19 @@ | |
import hu.textualmodeler.ast.Node; | |
import hu.textualmodeler.parser.AbstractTextualResource; | |
+import java.util.ArrayList; | |
import java.util.LinkedList; | |
import java.util.List; | |
-import org.eclipse.emf.ecore.EAttribute; | |
+import org.eclipse.emf.common.notify.AdapterFactory; | |
import org.eclipse.emf.ecore.EObject; | |
-import org.eclipse.emf.ecore.EReference; | |
-import org.eclipse.emf.ecore.EStructuralFeature; | |
import org.eclipse.emf.ecore.resource.Resource; | |
-import org.eclipse.emf.ecore.resource.Resource.Diagnostic; | |
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory; | |
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; | |
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; | |
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; | |
+import org.eclipse.jface.viewers.ILabelProvider; | |
import org.eclipse.jface.viewers.ITreeContentProvider; | |
-import org.eclipse.jface.viewers.LabelProvider; | |
import org.eclipse.jface.viewers.Viewer; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Display; | |
@@ -28,34 +30,44 @@ | |
*/ | |
public class TextualModelContentOutlinePage extends ContentOutlinePage implements ITreeContentProvider{ | |
- private final Resource resource; | |
+ private final AbstractTextualResource resource; | |
+ private AdapterFactory adapterFactory; | |
- private final LabelProvider labelProvider = new LabelProvider(){ | |
- @Override | |
- public String getText(Object element) { | |
- if (element instanceof Diagnostic){ | |
- Diagnostic d = (Diagnostic)element; | |
- return d.getMessage() +" ("+d.getLine()+":"+d.getColumn()+")"; | |
- } | |
- if (element instanceof EObject){ | |
- if (((EObject) element).eContainmentFeature() != null){ | |
- String cont = ((EObject) element).eContainmentFeature().getName(); | |
- return cont+": "+((EObject) element).eClass().getName()+" (hash: "+element.hashCode()+")"; | |
- } | |
- return ((EObject) element).eClass().getName()+" (hash: "+element.hashCode()+")"; | |
- } | |
- return super.getText(element); | |
- } | |
- }; | |
+ private ITreeContentProvider contentProvider; | |
+ private ILabelProvider labelProvider; | |
+ | |
+ private AdapterFactory createDomainAdapterFactory(){ | |
+ final List<AdapterFactory> factories = new ArrayList<AdapterFactory>(2); | |
+ factories.add(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE)); | |
+ factories.add(new ReflectiveItemProviderAdapterFactory()); | |
+ return new ComposedAdapterFactory(factories); | |
+ | |
+ } | |
public TextualModelContentOutlinePage(Resource resource) { | |
- this.resource = resource; | |
+ if (resource instanceof AbstractTextualResource){ | |
+ this.resource = (AbstractTextualResource)resource; | |
+ | |
+ }else{ | |
+ throw new IllegalArgumentException("Not a textual resource"); | |
+ } | |
} | |
public void update(){ | |
Display.getDefault().asyncExec(new Runnable(){ | |
@Override | |
public void run() { | |
+ if (adapterFactory == null){ | |
+ adapterFactory = createDomainAdapterFactory(); | |
+ | |
+ contentProvider = new AdapterFactoryContentProvider(adapterFactory); | |
+ labelProvider = new AdapterFactoryLabelProvider(adapterFactory); | |
+ | |
+ getTreeViewer().setContentProvider(TextualModelContentOutlinePage.this); | |
+ getTreeViewer().setLabelProvider(labelProvider); | |
+ getTreeViewer().setInput(resource); | |
+ } | |
+ | |
TextualModelContentOutlinePage.this.getTreeViewer().refresh(); | |
} | |
}); | |
@@ -64,16 +76,18 @@ | |
@Override | |
public void createControl(Composite parent) { | |
super.createControl(parent); | |
- | |
- getTreeViewer().setContentProvider(this); | |
- getTreeViewer().setLabelProvider(labelProvider); | |
- getTreeViewer().setInput(resource); | |
} | |
@Override | |
+ public void dispose() { | |
+ if (labelProvider != null){ | |
+ labelProvider.dispose(); | |
+ } | |
+ super.dispose(); | |
+ } | |
+ | |
+ @Override | |
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { | |
- // TODO Auto-generated method stub | |
- | |
} | |
@Override | |
@@ -81,7 +95,7 @@ | |
if (inputElement instanceof AbstractTextualResource){ | |
List<Object> result = new LinkedList<Object>(); | |
result.addAll(((Resource) inputElement).getErrors()); | |
- result.addAll(((Resource) inputElement).getContents()); | |
+ result.addAll(((AbstractTextualResource) inputElement).getContents()); | |
Node ast = ((AbstractTextualResource) inputElement).getAST(); | |
if (ast != null){ | |
result.add(ast); | |
@@ -90,48 +104,21 @@ | |
} | |
return new Object[0]; | |
} | |
- | |
- private String toText(EStructuralFeature f, Object o){ | |
- if (f instanceof EAttribute){ | |
- return f.getName()+" = \""+o+"\""; | |
- } | |
- if (f instanceof EReference){ | |
- return f.getName()+" -> "+labelProvider.getText(o); | |
- } | |
- return "<>"; | |
- } | |
- | |
- private boolean showAsChild(EStructuralFeature sf){ | |
- return (sf instanceof EAttribute) || !((EReference)sf).isContainment(); | |
- } | |
@Override | |
public Object[] getChildren(Object parentElement) { | |
+ if (parentElement instanceof Resource){ | |
+ return contentProvider.getElements(parentElement); | |
+ } | |
if (parentElement instanceof EObject){ | |
- List<Object> result = new LinkedList<Object>(); | |
- for(EStructuralFeature sf : ((EObject) parentElement).eClass().getEAllStructuralFeatures()) | |
- if (showAsChild(sf)){ | |
- Object v = ((EObject) parentElement).eGet(sf); | |
- if (v != null){ | |
- if (v instanceof List<?>){ | |
- for(Object o : ((List<?>) v).toArray()){ | |
- result.add(toText(sf, o)); | |
- } | |
- }else{ | |
- result.add(toText(sf, v)); | |
- } | |
- } | |
- } | |
- result.addAll(((EObject) parentElement).eContents()); | |
- return result.toArray(); | |
+ return contentProvider.getChildren(parentElement); | |
} | |
return new Object[0]; | |
} | |
@Override | |
public Object getParent(Object element) { | |
- // TODO Auto-generated method stub | |
- return null; | |
+ return contentProvider.getParent(element); | |
} | |
@Override | |
diff --git a/hu.textualmodeler.parser.test/src/hu/textualmodeler/parser/test/PeopleResource.java b/hu.textualmodeler.parser.test/src/hu/textualmodeler/parser/test/PeopleResource.java | |
index a7cc8f8..68c6c61 100644 | |
--- a/hu.textualmodeler.parser.test/src/hu/textualmodeler/parser/test/PeopleResource.java | |
+++ b/hu.textualmodeler.parser.test/src/hu/textualmodeler/parser/test/PeopleResource.java | |
@@ -22,12 +22,6 @@ | |
public class PeopleResource extends AbstractTextualResource { | |
/** | |
- * | |
- */ | |
- public PeopleResource() { | |
- } | |
- | |
- /** | |
* @param uri | |
*/ | |
public PeopleResource(URI uri) { | |
diff --git a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/AbstractTextualResource.java b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/AbstractTextualResource.java | |
index 2c583b7..b3ad3b0 100644 | |
--- a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/AbstractTextualResource.java | |
+++ b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/AbstractTextualResource.java | |
@@ -26,14 +26,17 @@ | |
* @author balazs.grill | |
* | |
*/ | |
-public abstract class AbstractTextualResource extends ResourceImpl { | |
+public abstract class AbstractTextualResource extends ResourceImpl implements IParserContext{ | |
- public AbstractTextualResource() { | |
- super(); | |
- } | |
+ private IParserInput input; | |
+ private IParser parser; | |
public AbstractTextualResource(URI uri) { | |
super(uri); | |
+ } | |
+ | |
+ public IGrammar getGrammar(){ | |
+ return parser.getGrammar(); | |
} | |
private static String inputStreamToString(InputStream inputStream) throws IOException{ | |
@@ -59,37 +62,13 @@ | |
String data = inputStreamToString(inputStream); | |
- final IParserInput[] input = new IParserInput[1]; | |
- IParserContext context = new IParserContext() { | |
- | |
- @Override | |
- public void logError(Diagnostic diagnostic) { | |
- getErrors().add(diagnostic); | |
- } | |
- | |
- @Override | |
- public void logError(Exception e) { | |
- getErrors().add(new ParsingError(e.getMessage(), input[0], null)); | |
- } | |
- | |
- @Override | |
- public IProgressMonitor getMonitor() { | |
- return new NullProgressMonitor(); | |
- } | |
- | |
- @Override | |
- public void logError(String message, VisibleNode node) { | |
- getErrors().add(new ParsingError(message, input[0], node)); | |
- } | |
- }; | |
+ parser = new EarleyParser(loadGrammar()); | |
+ input = new StringInput(data, parser.getGrammar().terminals(), this); | |
- IParser parser = new EarleyParser(loadGrammar()); | |
- input[0] = new StringInput(data, parser.getGrammar().terminals(), context); | |
- | |
- this.ast = parser.parse(input[0], context, 0); | |
+ this.ast = parser.parse(input, this, 0); | |
IFeatureResolver featureResolver = new ScopedFeatureResolver(createGlobalScope()); | |
- ModelBuilder builder = new ModelBuilder(featureResolver, context); | |
+ ModelBuilder builder = new ModelBuilder(featureResolver, this); | |
this.getContents().clear(); | |
if (this.ast instanceof CompositeNode){ | |
@@ -101,4 +80,24 @@ | |
} | |
+ @Override | |
+ public void logError(Diagnostic diagnostic) { | |
+ getErrors().add(diagnostic); | |
+ } | |
+ | |
+ @Override | |
+ public void logError(Exception e) { | |
+ getErrors().add(new ParsingError(e.getMessage(), input, null)); | |
+ } | |
+ | |
+ @Override | |
+ public IProgressMonitor getMonitor() { | |
+ return new NullProgressMonitor(); | |
+ } | |
+ | |
+ @Override | |
+ public void logError(String message, VisibleNode node) { | |
+ getErrors().add(new ParsingError(message, input, node)); | |
+ } | |
+ | |
} | |
diff --git a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/IGrammar.java b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/IGrammar.java | |
index 6cc31ba..a9f5c81 100644 | |
--- a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/IGrammar.java | |
+++ b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/IGrammar.java | |
@@ -18,4 +18,6 @@ | |
public Collection<Rule> getRule(String nonTerminal); | |
+ public Collection<String> getUsedEClassURIs(); | |
+ | |
} | |
diff --git a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/grammar/GrammarResource.java b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/grammar/GrammarResource.java | |
index 0ef3410..6a4d7df 100644 | |
--- a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/grammar/GrammarResource.java | |
+++ b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/grammar/GrammarResource.java | |
@@ -17,10 +17,6 @@ | |
*/ | |
public class GrammarResource extends AbstractTextualResource { | |
- public GrammarResource() { | |
- super(); | |
- } | |
- | |
public GrammarResource(URI uri){ | |
super(uri); | |
} | |
diff --git a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/impl/Grammar.java b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/impl/Grammar.java | |
index a216971..3b5a0d4 100644 | |
--- a/hu.textualmodeler.parser/src/hu/textualmodeler/parser/impl/Grammar.java | |
+++ b/hu.textualmodeler.parser/src/hu/textualmodeler/parser/impl/Grammar.java | |
@@ -4,7 +4,9 @@ | |
package hu.textualmodeler.parser.impl; | |
import hu.textualmodeler.grammar.GrammarModel; | |
+import hu.textualmodeler.grammar.Push; | |
import hu.textualmodeler.grammar.Rule; | |
+import hu.textualmodeler.grammar.RuleItem; | |
import hu.textualmodeler.grammar.Terminal; | |
import hu.textualmodeler.parser.IGrammar; | |
@@ -74,4 +76,19 @@ | |
return r == null ? Collections.<Rule>emptyList() : r; | |
} | |
+ @Override | |
+ public Collection<String> getUsedEClassURIs() { | |
+ List<String> result = new LinkedList<>(); | |
+ for(List<Rule> ruleList : rules.values()){ | |
+ for(Rule rule : ruleList){ | |
+ for(RuleItem ri : rule.getBody()){ | |
+ if (ri instanceof Push){ | |
+ result.add(((Push) ri).getEclassURI()); | |
+ } | |
+ } | |
+ } | |
+ } | |
+ return result; | |
+ } | |
+ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment