Merge branch 'master' into me/serializer

This commit is contained in:
Sebastian Zarnekow 2015-10-21 10:37:59 +02:00
commit 7667467a0c
12 changed files with 389 additions and 22 deletions

View file

@ -0,0 +1,16 @@
/*******************************************************************************
* Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.xtext.xtext.generator
/**
* @noimplement
*/
interface IGeneratesStub {
def boolean isGenerateStub()
def void setGenerateStub(boolean generateStub)
}

View file

@ -37,8 +37,9 @@ import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
import static extension org.eclipse.xtext.xtext.generator.util.GrammarUtil2.*
import org.eclipse.xtend.lib.annotations.Accessors
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
class Formatter2Fragment2 extends AbstractXtextGeneratorFragment {
class Formatter2Fragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject FileAccessFactory fileAccessFactory

View file

@ -36,8 +36,9 @@ import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector
import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
class GeneratorFragment2 extends AbstractXtextGeneratorFragment {
class GeneratorFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject CodeConfig codeConfig
@ -56,10 +57,10 @@ class GeneratorFragment2 extends AbstractXtextGeneratorFragment {
boolean generateXtendMain = false
@Accessors(PUBLIC_SETTER)
boolean generateStubs = true
boolean generateStub = true
def boolean isGenerateStub() {
!grammar.inheritsXbase && generateStubs
override boolean isGenerateStub() {
!grammar.inheritsXbase && generateStub
}
def boolean isGenerateJavaMain() {

View file

@ -30,8 +30,9 @@ import static org.eclipse.xtext.GrammarUtil.*
import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
import static extension org.eclipse.xtext.xtext.generator.util.GrammarUtil2.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
class ImportNamespacesScopingFragment2 extends AbstractXtextGeneratorFragment {
class ImportNamespacesScopingFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject extension XtextGeneratorNaming
@Inject extension XbaseUsageDetector

View file

@ -9,6 +9,7 @@ package org.eclipse.xtext.xtext.generator.serializer
import com.google.common.collect.ImmutableSet
import com.google.common.collect.LinkedHashMultimap
import com.google.common.collect.Multimap
import com.google.inject.Inject
import java.util.List
import java.util.Map
@ -54,6 +55,7 @@ import org.eclipse.xtext.serializer.sequencer.ITransientValueService
import org.eclipse.xtext.util.Strings
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.CodeConfig
import org.eclipse.xtext.xtext.generator.IGeneratesStub
import org.eclipse.xtext.xtext.generator.XtextGeneratorNaming
import org.eclipse.xtext.xtext.generator.grammarAccess.GrammarAccessExtensions
import org.eclipse.xtext.xtext.generator.model.FileAccessFactory
@ -66,10 +68,8 @@ import static extension org.eclipse.xtext.GrammarUtil.*
import static extension org.eclipse.xtext.serializer.analysis.SerializationContext.*
import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
import static extension org.eclipse.xtext.xtext.generator.util.GenModelUtil2.*
import com.google.common.collect.Multimaps
import com.google.common.collect.Multimap
class SerializerFragment2 extends AbstractXtextGeneratorFragment {
class SerializerFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
private static def <K, V> Map<K, V> toMap(Iterable<Pair<K, V>> items) {
val result = newLinkedHashMap

View file

@ -28,6 +28,7 @@ import org.eclipse.xtext.xtext.generator.model.TypeReference
import static extension org.eclipse.xtext.GrammarUtil.*
import static extension org.eclipse.xtext.xtext.generator.util.GrammarUtil2.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
/**
* Contributes the 'Abstract...ProposalProvider' and '...ProposalProvider' stub,
@ -35,7 +36,7 @@ import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
*
* @author Christian Schneider - Initial contribution and API
*/
class ContentAssistFragment2 extends AbstractXtextGeneratorFragment {
class ContentAssistFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject
extension XtextGeneratorNaming

View file

@ -19,13 +19,14 @@ import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector
import static extension org.eclipse.xtext.GrammarUtil.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
/**
* Contributes the Labeling provider stub, either in Xtend or Java language.
*
* @author Christian Schneider - Initial contribution and API
*/
class LabelProviderFragment2 extends AbstractXtextGeneratorFragment {
class LabelProviderFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
private static val XBASE_LABEL_PROVIDER =
"org.eclipse.xtext.xbase.ui.labeling.XbaseLabelProvider"

View file

@ -18,11 +18,12 @@ import org.eclipse.xtext.xtext.generator.model.TypeReference
import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.typeRef
import org.eclipse.xtext.xtext.generator.CodeConfig
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
/**
* @author Christian Schneider - Initial contribution and API
*/
class OutlineTreeProviderFragment2 extends AbstractXtextGeneratorFragment {
class OutlineTreeProviderFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject CodeConfig codeConfig
@Inject FileAccessFactory fileAccessFactory

View file

@ -20,13 +20,14 @@ import org.eclipse.xtext.xtext.generator.validation.ValidatorNaming
import static extension org.eclipse.xtext.GrammarUtil.*
import static extension org.eclipse.xtext.xtext.generator.util.GrammarUtil2.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
/**
* Contributes the Quickfix provider stub, either in Xtend or Java language.
*
* @author Christian Schneider - Initial contribution and API
*/
class QuickfixProviderFragment2 extends AbstractXtextGeneratorFragment {
class QuickfixProviderFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject
extension XtextGeneratorNaming

View file

@ -27,8 +27,9 @@ import static org.eclipse.xtext.GrammarUtil.*
import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.*
import static extension org.eclipse.xtext.xtext.generator.util.GrammarUtil2.*
import org.eclipse.xtext.xtext.generator.AbstractXtextGeneratorFragment
import org.eclipse.xtext.xtext.generator.IGeneratesStub
class ValidatorFragment2 extends AbstractXtextGeneratorFragment {
class ValidatorFragment2 extends AbstractXtextGeneratorFragment implements IGeneratesStub {
@Inject extension ValidatorNaming
@Inject extension XtextGeneratorNaming

View file

@ -195,14 +195,6 @@ class WebIntegrationFragment extends AbstractXtextGeneratorFragment {
super.checkConfiguration(issues)
if (framework === null)
issues.addError('The property \'framework\' is required.')
if (generateJsHighlighting && projectConfig.web.assets === null)
issues.addWarning('The \'webApp\' outlet is not defined in the project configuration; JS syntax highlighting is disabled.')
if (generateServlet && projectConfig.web.src === null)
issues.addWarning('The \'web.src\' outlet is not defined in the project configuration; the generated servlet is disabled.')
if (generateJettyLauncher && projectConfig.web.src === null)
issues.addWarning('The \'web.src\' outlet is not defined in the project configuration; the Jetty launcher is disabled.')
if (generateHtmlExample && projectConfig.web.assets === null)
issues.addWarning('The \'webApp\' outlet is not defined in the project configuration; the example HTML page is disabled.')
for (pattern : enabledPatterns.filter[suppressedPatterns.contains(it)]) {
issues.addError('The pattern \'' + pattern + '\' cannot be enabled and suppressed.')
}

View file

@ -0,0 +1,351 @@
/*******************************************************************************
* Copyright (c) 2015 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.xtext.generator.parser
import org.eclipse.xtext.generator.parser.antlr.AntlrGrammarComparator
import org.junit.Test
import static org.junit.Assert.*
/**
* Contributes unit tests for {@link AntlrGrammarComparator}.
*
* @author Christian Schneider - Initial contribution and API
*/
class AntlrGrammarComparatorTest {
AntlrGrammarComparator comparator = new AntlrGrammarComparator
TestErrorHandler errorHandler = new TestErrorHandler
private def compare(CharSequence grammar, CharSequence grammarReference) {
comparator.compareGrammars(grammar, grammarReference, errorHandler);
}
/**
* The pattern of "\"" is not expected to occur in ANTLR grammar,
* so I use it for testing the unmatched token check.
*/
@Test(expected = AssertionError)
def void unmatchedTokens01() {
val testee = '''
"\""a
'''
testee.compare(testee)
}
@Test
def void stringMatch_00a() {
val testee = '''
hans
'''
val expected = '''
hans
'''
testee.compare(expected)
}
@Test
def void stringMatch_00b() {
val testee = '''hans'''
val expected = '''hans'''
testee.compare(expected)
}
@Test
def void stringMatch_01a() {
val testee = '''
hans hugo
'''
val expected = '''
hans hugo
'''
testee.compare(expected)
}
@Test
def void stringMatch_01b() {
val testee = '''hans hugo'''
val expected = '''hans hugo'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_01a() {
val testee = '''
hans hugo
'''
val expected = '''
hugo hans
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_01b() {
val testee = '''hans hugo'''
val expected = '''hugo hans'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_02a() {
val testee = '''
hans
'''
val expected = '''
hans hugo
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_02b() {
val testee = '''hans'''
val expected = '''hans hugo'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_03a() {
val testee = '''
hans hugo
'''
val expected = '''
hans
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_03b() {
val testee = '''hans hugo'''
val expected = '''hans'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_04() {
val testee = '''hans hu'''
val expected = '''hans hugo'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void stringMismatch_05() {
val testee = '''hans hugo'''
val expected = '''hans hu'''
testee.compare(expected)
}
@Test
def void regExMatch01() {
val expected = '''
RULE_IN_RICH_STRING?
'''
val testee = '''
RULE_IN_RICH_STRING ?
'''
testee.compare(expected)
}
@Test
def void regExMatch02() {
val expected = '''
RULE_IN_RICH_STRING*
'''
val testee = '''
RULE_IN_RICH_STRING *
'''
testee.compare(expected)
}
@Test
def void regExMatch03() {
val expected = '''
RULE_IN_RICH_STRING+
'''
val testee = '''
RULE_IN_RICH_STRING +
'''
testee.compare(expected)
}
@Test
def void snippetMatch01() {
val expected = '''
grammar InternalStatemachine;
options {
superClass=AbstractInternalAntlrParser;
}
'''
val testee = '''
grammar InternalStatemachine ;
options{
superClass = AbstractInternalAntlrParser
;
}
'''
testee.compare(expected)
}
@Test
def void snippetMatch02() {
val expected = '''
(( 'abstract'
| 'annotation'
| 'class'
| '('
| RULE_ID | RULE_HEX )
'''
val testee = '''
(
('abstract' | 'annotation' | 'class' | '(' | RULE_ID | RULE_HEX )
'''
testee.compare(expected)
}
@Test
def void matchAllTokens01() {
val testee = '''
RULE_RICH_TEXT : '\'\'\'' RULE_IN_RICH_STRING* ('\'\'\''|('\'' '\''?)? EOF);
'''
testee.compare(testee)
}
@Test
def void matchAllTokens02() {
val testee = '''
RULE_RICH_TEXT_START : '\'\'\'' RULE_IN_RICH_STRING* ('\'' '\''?)? '\u00AB';
RULE_RICH_TEXT_END : '\u00BB' RULE_IN_RICH_STRING* ('\'\'\''|('\'' '\''?)? EOF);
RULE_RICH_TEXT_INBETWEEN : '\u00BB' RULE_IN_RICH_STRING* ('\'' '\''?)? '\u00AB';
RULE_COMMENT_RICH_TEXT_INBETWEEN : '\u00AB\u00AB' ~(('\n'|'\r'))* ('\r'? '\n' RULE_IN_RICH_STRING* ('\'' '\''?)? '\u00AB')?;
RULE_COMMENT_RICH_TEXT_END : '\u00AB\u00AB' ~(('\n'|'\r'))* ('\r'? '\n' RULE_IN_RICH_STRING* ('\'\'\''|('\'' '\''?)? EOF)|EOF);
'''
testee.compare(testee)
}
@Test(expected = AssertionError)
def void mismatchOfParantheses01() {
val testee = '''
hans ( ( hugo )
'''
val expected = '''
hans ( hugo )
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void mismatchOfParantheses02() {
val testee = '''
hans ( hugo ) )
'''
val expected = '''
hans ( hugo )
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void mismatchOfParantheses03() {
val testee = '''
{ '(' ( ')' }
'''
val expected = '''
{ '(' ')' }
'''
testee.compare(expected)
}
@Test(expected = AssertionError)
def void mismatchOfParantheses04() {
val testee = '''
{ '(' '( ')' }
'''
val expected = '''
{ '(' '(' ')' }
'''
testee.compare(expected)
}
private static class TestErrorHandler implements AntlrGrammarComparator.IErrorHandler {
override handleMismatch(String match, String matchReference, AntlrGrammarComparator.ErrorContext context) {
fail('''
Inputs differs at token «match» (line «context.testedGrammar.lineNumber»), expected token «
matchReference» (line «context.referenceGrammar.lineNumber» ).
''')
}
override handleInvalidGeneratedGrammarFile(AntlrGrammarComparator.ErrorContext context) {
fail('''
Noticed an unmatched character sequence in 'testee' in/before line «context.testedGrammar.lineNumber».
''')
}
override handleInvalidReferenceGrammarFile(AntlrGrammarComparator.ErrorContext context) {
fail('''
Noticed an unmatched character sequence in 'expected' in/before line «context.referenceGrammar.lineNumber».
''')
}
}
}