package com.github.jknack.antlr4ide.ui.builder;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import org.eclipse.xtext.builder.IXtextBuilderParticipant.IBuildContext;
import org.eclipse.emf.ecore.resource.Resource;
import com.github.jknack.antlr4ide.lang.Grammar;
import com.github.jknack.antlr4ide.lang.GrammarType;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
public class Antlr4BuilderParticipant extends org.eclipse.xtext.builder.BuilderParticipant {
static boolean DEBUG=false;
/**
* Build dependency strategy
* ===
*
* - TODO: If a grammar is used as IMPORT in other grammars, figure out if it should be built
* - Build sequence
* - - Lexer grammars
* - - Parser grammars
* - - Combined grammars
*
*/
@Override
protected List<org.eclipse.xtext.resource.IResourceDescription.Delta>
getRelevantDeltas(org.eclipse.xtext.builder.IXtextBuilderParticipant.IBuildContext context)
{
List<org.eclipse.xtext.resource.IResourceDescription.Delta> result = super.getRelevantDeltas(context);
if (result.size()<=1) return result; // no need to sort just one entry
List<org.eclipse.xtext.resource.IResourceDescription.Delta> resultLexers = new ArrayList();
List<org.eclipse.xtext.resource.IResourceDescription.Delta> resultParsers = new ArrayList();
List<org.eclipse.xtext.resource.IResourceDescription.Delta> resultOthers = new ArrayList();
List<org.eclipse.xtext.resource.IResourceDescription.Delta> resultFinal = new ArrayList();
int i=0;
for (org.eclipse.xtext.resource.IResourceDescription.Delta delta : result) {
Resource resource = context.getResourceSet().getResource(delta.getUri(), true);
Grammar grammar = grammarFromResource(resource);
if(DEBUG)
System.out.println(">>> Antlr4BuilderParticipant getRelevantDeltas ["+i+"]>"+delta.getUri()+"< type>"+grammar.getType()+"<");
if (grammar.getType()==GrammarType.LEXER)
resultLexers.add(delta);
else
if (grammar.getType()==GrammarType.PARSER)
resultParsers.add(delta);
else
resultOthers.add(delta);
i++;
}
Comparator compareUri = new CompareUri() ;
Collections.sort(resultLexers, compareUri);
Collections.sort(resultParsers, compareUri);
Collections.sort(resultOthers, compareUri);
resultFinal.addAll(resultLexers);
resultFinal.addAll(resultParsers);
resultFinal.addAll(resultOthers);
if(DEBUG) {
i=0;
for (org.eclipse.xtext.resource.IResourceDescription.Delta delta : resultFinal) {
System.out.println("++> Antlr4BuilderParticipant getRelevantDeltas ["+i+"]>"+delta.getUri()+"<");
i++;
}
}
return resultFinal;
}
/**
* Reads a grammar using a Resource as input.
* This implementation is inspired from @see(com.github.jknack.antlr4ide.ui.services.DefaultGrammarResource)
*/
private Grammar grammarFromResource(Resource _resourceFrom) {
EList<EObject> _contents = _resourceFrom.getContents();
EObject _head = IterableExtensions.<EObject>head(_contents);
return ((Grammar) _head);
}
/**
* Compare two resource URIs as strings.
*/
private class CompareUri implements Comparator<org.eclipse.xtext.resource.IResourceDescription.Delta> {
public int compare(org.eclipse.xtext.resource.IResourceDescription.Delta delta1
, org.eclipse.xtext.resource.IResourceDescription.Delta delta2)
{
return delta1.getUri().toString().compareTo(delta2.getUri().toString());
}
}
}