001/******************************************************************************* 002 * Copyright (c) 2018 Red Hat Inc 003 * All rights reserved. This program and the accompanying materials 004 * are made available under the terms of the Eclipse Public License v1.0 005 * which accompanies this distribution, and is available at 006 * http://www.eclipse.org/legal/epl-v10.html 007 * 008 * Contributors: 009 * Jens Reimann - initial API and implementation 010 *******************************************************************************/ 011package de.dentrassi.varlink.idl.serializer; 012 013import com.google.inject.Inject; 014import de.dentrassi.varlink.idl.services.VarlinkIdlGrammarAccess; 015import de.dentrassi.varlink.idl.varlinkIdl.Arguments; 016import de.dentrassi.varlink.idl.varlinkIdl.Array; 017import de.dentrassi.varlink.idl.varlinkIdl.BasicType; 018import de.dentrassi.varlink.idl.varlinkIdl.Dictionary; 019import de.dentrassi.varlink.idl.varlinkIdl.Field; 020import de.dentrassi.varlink.idl.varlinkIdl.Interface; 021import de.dentrassi.varlink.idl.varlinkIdl.Method; 022import de.dentrassi.varlink.idl.varlinkIdl.Optional; 023import de.dentrassi.varlink.idl.varlinkIdl.Result; 024import de.dentrassi.varlink.idl.varlinkIdl.TypeAlias; 025import de.dentrassi.varlink.idl.varlinkIdl.TypeReference; 026import de.dentrassi.varlink.idl.varlinkIdl.VarlinkIdlPackage; 027import java.util.Set; 028import org.eclipse.emf.ecore.EObject; 029import org.eclipse.emf.ecore.EPackage; 030import org.eclipse.xtext.Action; 031import org.eclipse.xtext.Parameter; 032import org.eclipse.xtext.ParserRule; 033import org.eclipse.xtext.serializer.ISerializationContext; 034import org.eclipse.xtext.serializer.acceptor.SequenceFeeder; 035import org.eclipse.xtext.serializer.sequencer.AbstractDelegatingSemanticSequencer; 036import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient; 037 038@SuppressWarnings("all") 039public class VarlinkIdlSemanticSequencer extends AbstractDelegatingSemanticSequencer { 040 041 @Inject 042 private VarlinkIdlGrammarAccess grammarAccess; 043 044 @Override 045 public void sequence(ISerializationContext context, EObject semanticObject) { 046 EPackage epackage = semanticObject.eClass().getEPackage(); 047 ParserRule rule = context.getParserRule(); 048 Action action = context.getAssignedAction(); 049 Set<Parameter> parameters = context.getEnabledBooleanParameters(); 050 if (epackage == VarlinkIdlPackage.eINSTANCE) 051 switch (semanticObject.eClass().getClassifierID()) { 052 case VarlinkIdlPackage.ARGUMENTS: 053 sequence_Arguments(context, (Arguments) semanticObject); 054 return; 055 case VarlinkIdlPackage.ARRAY: 056 sequence_Array(context, (Array) semanticObject); 057 return; 058 case VarlinkIdlPackage.BASIC_TYPE: 059 sequence_BasicType(context, (BasicType) semanticObject); 060 return; 061 case VarlinkIdlPackage.DICTIONARY: 062 sequence_Dictionary(context, (Dictionary) semanticObject); 063 return; 064 case VarlinkIdlPackage.ENUM: 065 sequence_Enum(context, (de.dentrassi.varlink.idl.varlinkIdl.Enum) semanticObject); 066 return; 067 case VarlinkIdlPackage.ERROR: 068 sequence_Error(context, (de.dentrassi.varlink.idl.varlinkIdl.Error) semanticObject); 069 return; 070 case VarlinkIdlPackage.FIELD: 071 sequence_Field(context, (Field) semanticObject); 072 return; 073 case VarlinkIdlPackage.INTERFACE: 074 sequence_Interface(context, (Interface) semanticObject); 075 return; 076 case VarlinkIdlPackage.METHOD: 077 sequence_Method(context, (Method) semanticObject); 078 return; 079 case VarlinkIdlPackage.OBJECT: 080 sequence_Object(context, (de.dentrassi.varlink.idl.varlinkIdl.Object) semanticObject); 081 return; 082 case VarlinkIdlPackage.OPTIONAL: 083 sequence_Optional(context, (Optional) semanticObject); 084 return; 085 case VarlinkIdlPackage.RESULT: 086 sequence_Result(context, (Result) semanticObject); 087 return; 088 case VarlinkIdlPackage.TYPE_ALIAS: 089 sequence_TypeAlias(context, (TypeAlias) semanticObject); 090 return; 091 case VarlinkIdlPackage.TYPE_REFERENCE: 092 sequence_TypeReference(context, (TypeReference) semanticObject); 093 return; 094 } 095 if (errorAcceptor != null) 096 errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context)); 097 } 098 099 /** 100 * Contexts: 101 * Arguments returns Arguments 102 * 103 * Constraint: 104 * arguments=Object 105 */ 106 protected void sequence_Arguments(ISerializationContext context, Arguments semanticObject) { 107 if (errorAcceptor != null) { 108 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.ARGUMENTS__ARGUMENTS) == ValueTransient.YES) 109 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.ARGUMENTS__ARGUMENTS)); 110 } 111 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 112 feeder.accept(grammarAccess.getArgumentsAccess().getArgumentsObjectParserRuleCall_0(), semanticObject.getArguments()); 113 feeder.finish(); 114 } 115 116 117 /** 118 * Contexts: 119 * ElementType returns Array 120 * Array returns Array 121 * 122 * Constraint: 123 * type=ElementType 124 */ 125 protected void sequence_Array(ISerializationContext context, Array semanticObject) { 126 if (errorAcceptor != null) { 127 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.ARRAY__TYPE) == ValueTransient.YES) 128 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.ARRAY__TYPE)); 129 } 130 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 131 feeder.accept(grammarAccess.getArrayAccess().getTypeElementTypeParserRuleCall_1_0(), semanticObject.getType()); 132 feeder.finish(); 133 } 134 135 136 /** 137 * Contexts: 138 * ElementType returns BasicType 139 * BasicType returns BasicType 140 * 141 * Constraint: 142 * (type='bool' | type='int' | type='float' | type='string') 143 */ 144 protected void sequence_BasicType(ISerializationContext context, BasicType semanticObject) { 145 genericSequencer.createSequence(context, semanticObject); 146 } 147 148 149 /** 150 * Contexts: 151 * ElementType returns Dictionary 152 * Dictionary returns Dictionary 153 * 154 * Constraint: 155 * type=ElementType 156 */ 157 protected void sequence_Dictionary(ISerializationContext context, Dictionary semanticObject) { 158 if (errorAcceptor != null) { 159 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.DICTIONARY__TYPE) == ValueTransient.YES) 160 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.DICTIONARY__TYPE)); 161 } 162 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 163 feeder.accept(grammarAccess.getDictionaryAccess().getTypeElementTypeParserRuleCall_1_0(), semanticObject.getType()); 164 feeder.finish(); 165 } 166 167 168 /** 169 * Contexts: 170 * TypeAliasDefinition returns Enum 171 * Enum returns Enum 172 * ElementType returns Enum 173 * 174 * Constraint: 175 * (fields+=ValidID fields+=ValidID*) 176 */ 177 protected void sequence_Enum(ISerializationContext context, de.dentrassi.varlink.idl.varlinkIdl.Enum semanticObject) { 178 genericSequencer.createSequence(context, semanticObject); 179 } 180 181 182 /** 183 * Contexts: 184 * Member returns Error 185 * Error returns Error 186 * 187 * Constraint: 188 * (name=ID properties=Object) 189 */ 190 protected void sequence_Error(ISerializationContext context, de.dentrassi.varlink.idl.varlinkIdl.Error semanticObject) { 191 if (errorAcceptor != null) { 192 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME) == ValueTransient.YES) 193 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME)); 194 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.ERROR__PROPERTIES) == ValueTransient.YES) 195 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.ERROR__PROPERTIES)); 196 } 197 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 198 feeder.accept(grammarAccess.getErrorAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName()); 199 feeder.accept(grammarAccess.getErrorAccess().getPropertiesObjectParserRuleCall_2_0(), semanticObject.getProperties()); 200 feeder.finish(); 201 } 202 203 204 /** 205 * Contexts: 206 * Field returns Field 207 * 208 * Constraint: 209 * (name=ValidID type=ElementType) 210 */ 211 protected void sequence_Field(ISerializationContext context, Field semanticObject) { 212 if (errorAcceptor != null) { 213 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.FIELD__NAME) == ValueTransient.YES) 214 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.FIELD__NAME)); 215 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.FIELD__TYPE) == ValueTransient.YES) 216 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.FIELD__TYPE)); 217 } 218 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 219 feeder.accept(grammarAccess.getFieldAccess().getNameValidIDParserRuleCall_0_0(), semanticObject.getName()); 220 feeder.accept(grammarAccess.getFieldAccess().getTypeElementTypeParserRuleCall_2_0(), semanticObject.getType()); 221 feeder.finish(); 222 } 223 224 225 /** 226 * Contexts: 227 * Interface returns Interface 228 * 229 * Constraint: 230 * (name=InterfaceName members+=Member*) 231 */ 232 protected void sequence_Interface(ISerializationContext context, Interface semanticObject) { 233 genericSequencer.createSequence(context, semanticObject); 234 } 235 236 237 /** 238 * Contexts: 239 * Member returns Method 240 * Method returns Method 241 * 242 * Constraint: 243 * (name=ID arguments=Arguments result=Result) 244 */ 245 protected void sequence_Method(ISerializationContext context, Method semanticObject) { 246 if (errorAcceptor != null) { 247 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME) == ValueTransient.YES) 248 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME)); 249 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.METHOD__ARGUMENTS) == ValueTransient.YES) 250 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.METHOD__ARGUMENTS)); 251 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.METHOD__RESULT) == ValueTransient.YES) 252 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.METHOD__RESULT)); 253 } 254 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 255 feeder.accept(grammarAccess.getMethodAccess().getNameIDTerminalRuleCall_1_0(), semanticObject.getName()); 256 feeder.accept(grammarAccess.getMethodAccess().getArgumentsArgumentsParserRuleCall_2_0(), semanticObject.getArguments()); 257 feeder.accept(grammarAccess.getMethodAccess().getResultResultParserRuleCall_4_0(), semanticObject.getResult()); 258 feeder.finish(); 259 } 260 261 262 /** 263 * Contexts: 264 * TypeAliasDefinition returns Object 265 * Object returns Object 266 * ElementType returns Object 267 * 268 * Constraint: 269 * (fields+=Field? fields+=Field*) 270 */ 271 protected void sequence_Object(ISerializationContext context, de.dentrassi.varlink.idl.varlinkIdl.Object semanticObject) { 272 genericSequencer.createSequence(context, semanticObject); 273 } 274 275 276 /** 277 * Contexts: 278 * ElementType returns Optional 279 * Optional returns Optional 280 * 281 * Constraint: 282 * type=ElementType 283 */ 284 protected void sequence_Optional(ISerializationContext context, Optional semanticObject) { 285 if (errorAcceptor != null) { 286 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.OPTIONAL__TYPE) == ValueTransient.YES) 287 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.OPTIONAL__TYPE)); 288 } 289 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 290 feeder.accept(grammarAccess.getOptionalAccess().getTypeElementTypeParserRuleCall_1_0(), semanticObject.getType()); 291 feeder.finish(); 292 } 293 294 295 /** 296 * Contexts: 297 * Result returns Result 298 * 299 * Constraint: 300 * result=Object 301 */ 302 protected void sequence_Result(ISerializationContext context, Result semanticObject) { 303 if (errorAcceptor != null) { 304 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.RESULT__RESULT) == ValueTransient.YES) 305 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.RESULT__RESULT)); 306 } 307 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 308 feeder.accept(grammarAccess.getResultAccess().getResultObjectParserRuleCall_0(), semanticObject.getResult()); 309 feeder.finish(); 310 } 311 312 313 /** 314 * Contexts: 315 * Member returns TypeAlias 316 * TypeAlias returns TypeAlias 317 * 318 * Constraint: 319 * (name=ValidID definition=TypeAliasDefinition) 320 */ 321 protected void sequence_TypeAlias(ISerializationContext context, TypeAlias semanticObject) { 322 if (errorAcceptor != null) { 323 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME) == ValueTransient.YES) 324 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.MEMBER__NAME)); 325 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.TYPE_ALIAS__DEFINITION) == ValueTransient.YES) 326 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.TYPE_ALIAS__DEFINITION)); 327 } 328 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 329 feeder.accept(grammarAccess.getTypeAliasAccess().getNameValidIDParserRuleCall_1_0(), semanticObject.getName()); 330 feeder.accept(grammarAccess.getTypeAliasAccess().getDefinitionTypeAliasDefinitionParserRuleCall_2_0(), semanticObject.getDefinition()); 331 feeder.finish(); 332 } 333 334 335 /** 336 * Contexts: 337 * ElementType returns TypeReference 338 * TypeReference returns TypeReference 339 * 340 * Constraint: 341 * name=[TypeAlias|ID] 342 */ 343 protected void sequence_TypeReference(ISerializationContext context, TypeReference semanticObject) { 344 if (errorAcceptor != null) { 345 if (transientValues.isValueTransient(semanticObject, VarlinkIdlPackage.Literals.TYPE_REFERENCE__NAME) == ValueTransient.YES) 346 errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, VarlinkIdlPackage.Literals.TYPE_REFERENCE__NAME)); 347 } 348 SequenceFeeder feeder = createSequencerFeeder(context, semanticObject); 349 feeder.accept(grammarAccess.getTypeReferenceAccess().getNameTypeAliasIDTerminalRuleCall_0_1(), semanticObject.eGet(VarlinkIdlPackage.Literals.TYPE_REFERENCE__NAME, false)); 350 feeder.finish(); 351 } 352 353 354}