﻿/*
 * Copyright (c) 2010 Artem Tikhomirov 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
 *
 * Contributors:
 *    Artem Tikhomirov (independent) - initial API and implementation
 */

«IMPORT 'http://www.eclipse.org/gmf/2009/GenModel'»

«EXTENSION xpt::GenEditorGenerator»

// Generic types
«DEFINE G(String type) FOR gmfgen::GenCommonBase»«IF self.jdkComplianceLevel() > 4»<«type»>«ELSE»/*[«type»]*/«ENDIF»«ENDDEFINE»
«DEFINE G2(String type1, String type2) FOR gmfgen::GenCommonBase»«IF self.jdkComplianceLevel() > 4»<«type1», «type2»>«ELSE»/*[«type1», «type2»]*/«ENDIF»«ENDDEFINE»
«DEFINE _g2_3(String t, String a, String b, String c) FOR gmfgen::GenCommonBase»«t»«IF self.jdkComplianceLevel() > 4»<«a», «b»<«c»>>«ELSE»/*[«a», «b»[«c»]]*/«ENDIF»«ENDDEFINE»

// e.g. java.util.List<String>
«DEFINE G(String type, String typeArgument) FOR gmfgen::GenCommonBase»«type»«EXPAND G(typeArgument)»«ENDDEFINE»
// e.g. java.util.Map<String, Integer>
«DEFINE G2(String type, String typeArgument1, String typeArgument2) FOR gmfgen::GenCommonBase»«type»«EXPAND G2(typeArgument1, typeArgument2)»«ENDDEFINE»

// java.util.List<String> varName = new Type<TypeArgument>
// note, no constructor parameters, callers should add (); or whatever they think is reasonable
// XXX perhaps, varName should go first, to be consistent with iterate?
«DEFINE newGenericInstance(String varName, String type, String typeArgument) FOR gmfgen::GenCommonBase»«EXPAND G(type, typeArgument)» «varName» = new «EXPAND G(type, typeArgument)»«ENDDEFINE»

// new HashMap<Object, String>
«DEFINE newGenericInstance2(String varName, String type, String typeArgument1, String typeArgument2) FOR gmfgen::GenCommonBase»«EXPAND G2(type, typeArgument1, typeArgument2)» «varName»= new «EXPAND G2(type, typeArgument1, typeArgument2)»«ENDDEFINE»

// new HashMap<Object, List<String>>
«DEFINE newGenericInstance2(String varName, String type, String typeArgument1, String typeArgument2, String typeArgument3) FOR gmfgen::GenCommonBase»«EXPAND _g2_3(type, typeArgument1, typeArgument2, typeArgument3)» «varName»= new «EXPAND _g2_3(type, typeArgument1, typeArgument2, typeArgument3)»«ENDDEFINE»

// iterate cycle with explicit iterator variable
// use this one if you need access to iterator (i.e. remove elements) or when there's no java.lang.Iterable source (i.e. some API gives Iterator right away)
«DEFINE iterate(String elementVar, String elementType, String iteratorVar, String iterationSource) FOR gmfgen::GenCommonBase-»
for («EXPAND G('java.util.Iterator', elementType)» «iteratorVar» = «iterationSource»; «iteratorVar».hasNext();) {
	«elementType» «elementVar» = «IF 'Object' <> elementType /*cast to Object is implicit*/ and not (self.jdkComplianceLevel() > 4) /*generics are not used then, should cast. Using 'not greater 4' instead of 'less than 5' to handle null/undefined case correctly*/»(«elementType») «ENDIF»«iteratorVar».next();
«ENDDEFINE»

//
// generates Java5-style iterate cycle (no explicit iterator), if possibl, otherwise uses default iterator name, 'it'
// beware of nested cycles using same 'it' name (relevant for Java 1.4)
«DEFINE iterate(String elementVar, String elementType, String iterable /*java.lang.Iterable*/) FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 4 -»
for («elementType» «elementVar» : «iterable») {
«ELSE-»
«EXPAND iterate(elementVar, elementType, 'it', iterable.concat('.iterator()'))-»
«ENDIF-»
«ENDDEFINE»

«DEFINE emptyList FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 4 -»
java.util.Collections.emptyList()«ELSE-»
java.util.Collections.EMPTY_LIST«ENDIF-»
«ENDDEFINE»

«DEFINE emptyMap(String genericTypes) FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 4 -»
java.util.Collections.<«genericTypes»>emptyMap()«ELSE-»
java.util.Collections.EMPTY_MAP«ENDIF-»
«ENDDEFINE»

// when need to cast 1.5-typed variable to be usable in 1.4 code. does nothing for 1.5 and greater. I.e.
//   List/*[String]*/ coll = ...
//   String aaa = (String) coll.get(0);
// cast to string is needed in 1.4
«DEFINE castTyped(String type) FOR gmfgen::GenCommonBase»«IF not (self.jdkComplianceLevel() > 4)»(«type») «ENDIF»«ENDDEFINE»

// annotations are from Java 5 and above
«DEFINE SuppressWarnings(String warnToken) FOR gmfgen::GenEditorGenerator»«EXPAND SuppressWarnings(warnToken) FOR diagram»«ENDDEFINE»
«DEFINE SuppressWarnings(String warnToken) FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 4 -»
@SuppressWarnings(«warnToken»)
«ENDIF-»
«ENDDEFINE»

«DEFINE override FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 4-»
@Override
«ENDIF-»
«ENDDEFINE»

«DEFINE overrideI FOR gmfgen::GenCommonBase-»
«IF self.jdkComplianceLevel() > 5-»
@Override
«ENDIF-»
«ENDDEFINE»