mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
Merge branch 'master' into me/serializer
This commit is contained in:
commit
7667467a0c
12 changed files with 389 additions and 22 deletions
|
@ -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)
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.')
|
||||
}
|
||||
|
|
|
@ -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».
|
||||
''')
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue