Skip to content

Instantly share code, notes, and snippets.

@balazsgrill
Last active December 30, 2015 03:39
Show Gist options
  • Save balazsgrill/7770351 to your computer and use it in GitHub Desktop.
Save balazsgrill/7770351 to your computer and use it in GitHub Desktop.
textualmodeler diff
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