blob: 6d56f4600822af44a17c17fc433d1a90e2aa41a7 [file] [log] [blame]
/*
* Copyright (c) 2008, 2010 Borland Software Corporation 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 (Borland) - initial API and implementation
*/
import xpt.StringOperations;
import xpt.GenModelUtils;
import gmf.CodeGenerationUtils;
import gmf.GenPackageUtils;
modeltype genmodel uses "http://www.eclipse.org/emf/2002/GenModel";
modeltype ecore uses "http://www.eclipse.org/emf/2002/Ecore";
/*
* NOTE: Extensions from this file are supposed to be used
* ONLY from MetaModel.xpt. No other .xpt or .ext should import
* this file. Common GenModel functionality, unrelated to meta-model
* access and access to generated model code should go into GenModelUtils.ext.
*/
library MetaModel;
--
-- GenPackageImpl#getQualifiedPackageInterfaceName()
--
helper getQualifiedPackageInterfaceName(gp : genmodel::GenPackage) : String {
return getGenPackageQualifiedPackageInterfaceName(gp)
}
--
-- GenPackageImpl#getQualifiedFactoryInterfaceName()
--
helper getQualifiedFactoryInterfaceName(gp : genmodel::GenPackage) : String {
return getGenPackageQualifiedFactoryInterfaceName(gp)
}
--
-- GenPackage#getFactoryInstanceName
--
helper getFactoryInstanceName(gp : genmodel::GenPackage) : String {
return (if gp.genModel.suppressEMFMetaData then 'INSTANCE' else 'eINSTANCE' endif)
}
--
-- GenPackageImpl#getQualifiedItemProviderAdapterFactoryClassName()
--
helper getQualifiedItemProviderAdapterFactoryClassName(gp : genmodel::GenPackage) : String {
return getQualifiedPackageName(gp, gp.providerPackageSuffix) + '.' + getItemProviderAdapterFactoryClassName(gp)
}
--
-- GenPackageImpl#getItemProviderAdapterFactoryClassName()
--
-- MODIFIERS: private
helper getItemProviderAdapterFactoryClassName(gp : genmodel::GenPackage) : String {
return getPrefixedName(gp, 'ItemProviderAdapterFactory')
}
--
-- GenClass#getQualifiedInterfaceName
--
helper getQualifiedInterfaceName(gc : genmodel::GenClass) : String {
return getGenPackageQualifiedInterfaceName(gc)
}
--
-- GenPackageImpl#getInterfacePackageName()
--
-- MODIFIERS: private
helper getInterfacePackageName(gp : genmodel::GenPackage) : String {
return getQualifiedPackageName(gp, gp.interfacePackageSuffix)
}
-- NOTE GenDataType#getQualifiedInstanceClassName returns primitive types as is,
-- while we return their java.lang wrappers
helper genmodel::GenClassifier::getQualifiedClassName() : String {
return null
}
helper genmodel::GenDataType::getQualifiedClassName() : String {
return getObjectCompatibleClassName(self.ecoreDataType)
}
helper genmodel::GenEnum::getQualifiedClassName() : String {
return getInterfacePackageName(self.genPackage) + '.' + self.ecoreEnum.name
}
--
-- GenClass#getClassifierAccessorName
--
helper getClassifierAccessorName(gc : genmodel::GenClassifier) : String {
return switch { case (gc.getEcoreClassifier().name = 'Class') 'Class_'; case (gc.getEcoreClassifier().name = 'Name') 'Name_'; else gc.getEcoreClassifier().name; }
}
--
-- GenFeature#getFeatureAccessorName
--
helper getFeatureAccessorName(gf : genmodel::GenFeature) : String {
return gf.genClass.ecoreClass.name + '_' + gf.ecoreFeature.name.firstToUpper()
}
-- GenFeatureImpl#getAccessorName
helper getAccessorName(gf : genmodel::GenFeature) : String {
return (if isMapEntryFeature(gf) then 'Typed' + gf.ecoreFeature.name.firstToUpper() else gf.ecoreFeature.name.firstToUpper() endif)
}
-- GenClassImpl#isMapEntry
helper isMapEntry(gc : genmodel::GenClass) : Boolean {
return 'java.util.Map.Entry' = gc.ecoreClass.instanceClassName or 'java.util.Map$Entry' = gc.ecoreClass.instanceClassName and (gc.ecoreClass.getEStructuralFeature('key') <> null and gc.ecoreClass.getEStructuralFeature('value') <> null)
}
/*
* Casts the argument (which is assumed to be of the given source class) to the given target class.
* A null value may be used for both source and target class to specify the EObject class.
* If the cast is required, it will be parenthesized as a whole, producing, e.g., ((EObject) o).
* If the parentheses are not required, use unparenthesizedCast() extension.
*/
helper parenthesizedCast(what : String, source : genmodel::GenClass, target : genmodel::GenClass) : String {
return (if needsCast(source, target) then '(' + unparenthesizedCast(what, source, target) + ')' else what endif)
}
/*
* Casts the argument (which is assumed to be of the given source class) to the given target class.
* A null value may be used for both source and target class to specify the EObject class.
* If the cast is required, it will NOT be parenthesized as a whole, producing, e.g., (EObject) o.
* If the parentheses are required, use parenthesizedCast() extension.
*/
helper unparenthesizedCast(what : String, source : genmodel::GenClass, target : genmodel::GenClass) : String {
return (if needsCast(source, target) then (if target = null then '(org.eclipse.emf.ecore.EObject)' + what else '(' + getQualifiedInterfaceName(target) + ')' + what endif) else what endif)
}
--See cast()
-- MODIFIERS: private
helper needsCast(source : genmodel::GenClass, target : genmodel::GenClass) : Boolean {
return (if source = target then false else (if target = null then source <> null and isExternalInterface(source) else source = null or (isExternalInterface(target) or (isExternalInterface(source) or not target.isSuperTypeOf(source))) endif) endif)
}
-- MODIFIERS: private
helper genmodel::GenClassifier::getEcoreClassifier() : ecore::EClassifier { return null }
-- MODIFIERS: private
helper genmodel::GenClass::getEcoreClassifier() : ecore::EClassifier { return self.ecoreClass }
-- MODIFIERS: private
helper genmodel::GenDataType::getEcoreClassifier() : ecore::EClassifier { return self.ecoreDataType }
-- GenPackageImpl#getReflectionPackageName()
-- MODIFIERS: private
helper getReflectionPackageName(gp : genmodel::GenPackage) : String {
return getQualifiedPackageName(gp, gp.metaDataPackageSuffix)
}
-- GenPackageImpl#getQualifiedPackageClassName()
-- MODIFIERS: private
helper getQualifiedPackageClassName(gp : genmodel::GenPackage) : String {
return getReflectionClassPackageName(gp) + '.' + getPackageClassName(gp)
}
-- GenPackageImpl#getReflectionClassPackageName()
-- MODIFIERS: private
helper getReflectionClassPackageName(gp : genmodel::GenPackage) : String {
return getQualifiedPackageName(gp, (if gp.genModel.suppressInterfaces then gp.metaDataPackageSuffix else gp.classPackageSuffix endif))
}
-- GenPackageImpl#getPackageClassName()
-- MODIFIERS: private
helper getPackageClassName(gp : genmodel::GenPackage) : String {
return (if not gp.genModel.suppressEMFMetaData and not gp.genModel.suppressInterfaces then getPackageInterfaceName(gp) + 'Impl' else getPackageInterfaceName(gp) endif)
}
-- GenPackageImpl#getPackageInterfaceName()
-- MODIFIERS: private
helper getPackageInterfaceName(gp : genmodel::GenPackage) : String {
return (if gp.genModel.suppressEMFMetaData and not gp.genModel.suppressInterfaces then getPrefixedName(gp, 'PackageImpl') else getPrefixedName(gp, 'Package') endif)
}
-- GenPackageImpl#getPrefixedName()
-- MODIFIERS: private
helper getPrefixedName(gp : genmodel::GenPackage, name : String) : String {
return (if null <> gp.prefix then gp.prefix + name else name endif)
}
-- GenPackageImpl#getQualifiedPackageName(String)
-- MODIFIERS: private
helper getQualifiedPackageName(gp : genmodel::GenPackage, suffix : String) : String {
return (if isBlank(suffix) then getQualifiedPackageName(gp) else getQualifiedPackageName(gp) + '.' + suffix endif)
}
-- GenPackageImpl#getQualifiedPackageName()
-- MODIFIERS: private
helper getQualifiedPackageName(gp : genmodel::GenPackage) : String {
return (if isBlank(gp.basePackage) then safeName(gp.ecorePackage.name) else gp.basePackage + '.' + safeName(gp.ecorePackage.name) endif)
}
-- GenFeatureImpl#isMapEntryFeature
-- MODIFIERS: private
helper isMapEntryFeature(gf : genmodel::GenFeature) : Boolean {
return isMapEntry(gf.genClass) and ('key' = gf.ecoreFeature.name or 'value' = gf.ecoreFeature.name)
}
-- MODIFIERS: private
helper isBlank(s : String) : Boolean {
return null = s or s.size() = 0
}