Mercurial > pub > bltoolkit
diff Tools/CodeGenerator/ValueMapping.xslt @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Tools/CodeGenerator/ValueMapping.xslt Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,492 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> + + <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/> + + <!-- parameters passed in by the TransformCodeGenerator --> + <xsl:param name="generator"></xsl:param> + <xsl:param name="version"></xsl:param> + <xsl:param name="filename"></xsl:param> + <xsl:param name="date-created"></xsl:param> + <xsl:param name="created-by"></xsl:param> + <xsl:param name="namespace"></xsl:param> + <xsl:param name="output"></xsl:param> + + <!-- support variables --> + <xsl:variable name="lf" xml:space="preserve"> </xsl:variable> + <xsl:variable name="t1" xml:space="preserve">	</xsl:variable> + <xsl:variable name="t2" xml:space="preserve">		</xsl:variable> + <xsl:variable name="t3" xml:space="preserve">			</xsl:variable> + <xsl:variable name="t4" xml:space="preserve">				</xsl:variable> + <xsl:variable name="t5" xml:space="preserve">					</xsl:variable> + <xsl:variable name="t6" xml:space="preserve">						</xsl:variable> + <xsl:variable name="t7" xml:space="preserve">							</xsl:variable> + <xsl:variable name="t8" xml:space="preserve">								</xsl:variable> + <xsl:variable name="s1" xml:space="preserve"> </xsl:variable> + <xsl:variable name="s2" xml:space="preserve">  </xsl:variable> + <xsl:variable name="s3" xml:space="preserve">   </xsl:variable> + <xsl:variable name="s4" xml:space="preserve">    </xsl:variable> + <xsl:variable name="s5" xml:space="preserve">     </xsl:variable> + <xsl:variable name="s6" xml:space="preserve">      </xsl:variable> + <xsl:variable name="s7" xml:space="preserve">       </xsl:variable> + <xsl:variable name="s8" xml:space="preserve">        </xsl:variable> + + <!-- customization --> + <xsl:variable name="baseclassname" select="'MB'"/> + <xsl:variable name="nullableprefix" select="'N'"/> + <xsl:variable name="instancename" select="'I'"/> + <xsl:variable name="getmethodspec" select="'Get(IMapDataSource s, object o, int i'"/> + <xsl:variable name="setmethodspec" select="'Set(IMapDataDestination d, object o, int i'"/> + <xsl:variable name="padding" select="string-length('DateTimeOffset?') + 1"/> + + <!-- the root of all evil --> + <xsl:template match="/"> + <!--<xsl:call-template name="header-comment"/>--> + <xsl:apply-templates select="code"/> + </xsl:template> + + <xsl:template name="header-comment"> + <xsl:value-of select="$lf"/> + <xsl:text>#region Generated File</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text>/*</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> * GENERATED FILE -- DO NOT EDIT</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> *</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> * Generator: </xsl:text> + <xsl:value-of select="$generator"/> + <xsl:value-of select="$lf"/> + <xsl:text> * Version: </xsl:text> + <xsl:value-of select="$version"/> + <xsl:value-of select="$lf"/> + <xsl:text> *</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> *</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> * Generated code from "</xsl:text> + <xsl:value-of select="$filename"/> + <xsl:text>"</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> *</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> * Created: </xsl:text> + <xsl:value-of select="$date-created"/> + <xsl:value-of select="$lf"/> + <xsl:text> * By: </xsl:text> + <xsl:value-of select="$created-by"/> + <xsl:value-of select="$lf"/> + <xsl:text> *</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text> */</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:text>#endregion</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:template> + + <xsl:template match="code"> + <xsl:apply-templates select="using"/> + <xsl:value-of select="$lf"/> + <xsl:text>namespace </xsl:text> + <xsl:value-of select="$namespace"/> + <xsl:value-of select="$lf"/> + <xsl:text>{</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:call-template name="class"/> + <xsl:text>}</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:template> + + <xsl:template match="using"> + <xsl:text>using </xsl:text> + <xsl:value-of select="@namespace"/> + <xsl:text>;</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:template> + + <!-- the class definition --> + <xsl:template name="class"> + <xsl:value-of select="$t1"/> + <xsl:text>public static partial class ValueMapping</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t1"/> + <xsl:text>{</xsl:text> + <xsl:value-of select="$lf"/> + + <xsl:apply-templates select="group|comment|br" mode="to"> + <xsl:with-param name="mode" select="'select'"/> + </xsl:apply-templates> + + <xsl:text>}</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:template> + + <!-- group --> + <xsl:template match="group" mode="to"> + + <xsl:param name="mode"/> + + <xsl:if test="@nullable='true'"> + <xsl:text>#if FW2</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + <xsl:if test="@name"> + <xsl:value-of select="$t2"/> + <xsl:text>#region </xsl:text> + <xsl:value-of select="@name"/> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$lf"/> + </xsl:if> + + <xsl:apply-templates select="type|comment|br" mode="to"> + <xsl:with-param name="tonullable" select="@nullable='true'"/> + <xsl:with-param name="mode" select="$mode"/> + </xsl:apply-templates> + + <xsl:if test="@name"> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>#endregion </xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + <xsl:if test="@nullable='true'"> + <xsl:text>#endif</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + </xsl:template> + + <xsl:template match="group" mode="from"> + <xsl:param name="tonick"/> + <xsl:param name="totype"/> + <xsl:param name="tonullable"/> + + <xsl:param name="mode"/> + + <xsl:if test="@nullable='true'"> + <xsl:text>#if FW2</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + <xsl:apply-templates select="type|comment|br" mode="from"> + <xsl:with-param name="fromnullable" select="@nullable='true'"/> + <xsl:with-param name="tonick" select="$tonick"/> + <xsl:with-param name="totype" select="$totype"/> + <xsl:with-param name="tonullable" select="$tonullable"/> + <xsl:with-param name="mode" select="$mode"/> + </xsl:apply-templates> + + <xsl:if test="@nullable='true'"> + <xsl:text>#endif</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + </xsl:template> + + <!-- type --> + <xsl:template match="type" mode="to"> + + <xsl:param name="tonullable"/> + <xsl:param name="mode"/> + + <xsl:variable name="name" select="@name"/> + <xsl:variable name="tonullablelocal" select="@nullable='true' or $tonullable"/> + <xsl:variable name="tonick"> + <xsl:if test="$tonullablelocal"> + <xsl:value-of select="$nullableprefix"/> + </xsl:if> + <xsl:choose> + <xsl:when test="@nick"> + <xsl:value-of select="@nick"/> + </xsl:when> + <xsl:when test="/code/nick[@type=$name]"> + <xsl:value-of select="/code/nick[@type=$name]/@name"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:if test="$tonullablelocal"> + <xsl:text>#if FW2</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>private static IValueMapper Get</xsl:text> + <xsl:value-of select="$tonick"/> + <xsl:text>Mapper(Type t)</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>{</xsl:text> + <xsl:value-of select="$lf"/> + + <xsl:apply-templates select="/code/group|/code/comment|/code/br" mode="from"> + <xsl:with-param name="tonick" select="$tonick"/> + <xsl:with-param name="totype" select="@name"/> + <xsl:with-param name="tonullable" select="$tonullablelocal"/> + <xsl:with-param name="mode" select="$mode"/> + </xsl:apply-templates> + + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>return null;</xsl:text> + <xsl:value-of select="$lf"/> + + <xsl:value-of select="$t2"/> + <xsl:text>}</xsl:text> + <xsl:value-of select="$lf"/> + + <xsl:if test="$tonullablelocal"> + <xsl:text>#endif</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:if> + + </xsl:template> + + + <xsl:template match="type" mode="from"> + + <xsl:param name="fromnullable"/> + <xsl:param name="tonick"/> + <xsl:param name="totype"/> + <xsl:param name="tonullable"/> + <xsl:param name="mode"/> + + <xsl:variable name="name" select="@name"/> + <xsl:variable name="fromnullablelocal" select="@nullable='true' or $fromnullable"/> + + <xsl:call-template name="generate"> + <xsl:with-param name="totype" select="$totype"/> + <xsl:with-param name="tonullable" select="$tonullable"/> + <xsl:with-param name="tonick" select="$tonick"/> + <xsl:with-param name="fromnick"> + <xsl:if test="$fromnullablelocal"> + <xsl:value-of select="$nullableprefix"/> + </xsl:if> + <xsl:choose> + <xsl:when test="@nick"> + <xsl:value-of select="@nick"/> + </xsl:when> + <xsl:when test="/code/nick[@type=$name]"> + <xsl:value-of select="/code/nick[@type=$name]/@name"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:with-param> + <xsl:with-param name="fromtype" select="@name"/> + <xsl:with-param name="fromnullable" select="$fromnullablelocal"/> + <xsl:with-param name="mode" select="$mode"/> + </xsl:call-template> + + </xsl:template> + + <xsl:template name="generate"> + <xsl:param name="tonick"/> + <xsl:param name="totype"/> + <xsl:param name="tonullable"/> + <xsl:param name="fromnick"/> + <xsl:param name="fromtype"/> + <xsl:param name="fromnullable"/> + <xsl:param name="mode"/> + + <xsl:variable name="tofulltype"> + <xsl:value-of select="$totype"/> + <xsl:if test="$tonullable"> + <xsl:text>?</xsl:text> + </xsl:if> + </xsl:variable> + <xsl:variable name="tolongtype"> + <xsl:if test="$tonullable"> + <xsl:text>Nullable</xsl:text> + </xsl:if> + <xsl:value-of select="$totype"/> + </xsl:variable> + <xsl:variable name="totypepad" select="$padding - string-length($tofulltype)"/> + + <xsl:variable name="fromfulltype"> + <xsl:value-of select="$fromtype"/> + <xsl:if test="$fromnullable"> + <xsl:text>?</xsl:text> + </xsl:if> + </xsl:variable> + <xsl:variable name="fromlongtype"> + <xsl:if test="$fromnullable"> + <xsl:text>Nullable</xsl:text> + </xsl:if> + <xsl:value-of select="$fromtype"/> + </xsl:variable> + <xsl:variable name="fromtypepad" select="$padding - string-length($fromfulltype)"/> + + <xsl:choose> + <xsl:when test="$mode='mapper'"> + <xsl:value-of select="$t1"/> + <xsl:text>internal sealed class </xsl:text> + <xsl:value-of select="$fromnick"/> + <xsl:text>To</xsl:text> + <xsl:value-of select="$tonick"/> + <xsl:text> : IValueMapper</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t1"/> + <xsl:text>{</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>public void Map(</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>IMapDataSource source, object sourceObject, int sourceIndex,</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>IMapDataDestination dest, object destObject, int destIndex)</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>{</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>if (source.IsNull(sourceObject, sourceIndex))</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t4"/> + <xsl:text>dest.SetNull(destObject, destIndex);</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>else</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t4"/> + <xsl:text>dest.Set</xsl:text> + <xsl:value-of select="$tolongtype"/> + <xsl:text>(destObject, destIndex,</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t5"/> + + <xsl:if test="not($tonick=$fromnick)"> + <xsl:text>Convert.To</xsl:text> + <xsl:value-of select="$tolongtype"/> + <xsl:text>(</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t6"/> + </xsl:if> + + <xsl:text>source.Get</xsl:text> + <xsl:value-of select="$fromlongtype"/> + <xsl:text>(sourceObject, sourceIndex))</xsl:text> + + <xsl:if test="not($tonick=$fromnick)"> + <xsl:text>)</xsl:text> + </xsl:if> + + <xsl:text>;</xsl:text> + + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t2"/> + <xsl:text>}</xsl:text> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t1"/> + <xsl:text>}</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:when> + <xsl:when test="$mode='select'"> + <xsl:value-of select="$t3"/> + <xsl:text>if (t == typeof(</xsl:text> + <xsl:value-of select="$fromfulltype"/> + <xsl:text>))</xsl:text> + <xsl:call-template name ="writeSpaces"> + <xsl:with-param name="count" select="$fromtypepad"/> + </xsl:call-template> + <xsl:text>return new </xsl:text> + <xsl:value-of select="$fromnick"/> + <xsl:text>To</xsl:text> + <xsl:value-of select="$tonick"/> + <xsl:text>();</xsl:text> + <xsl:value-of select="$lf"/> + </xsl:when> + </xsl:choose> + </xsl:template> + + <!-- comments --> + <xsl:template name ="comment"> + <xsl:if test="text()"> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>// </xsl:text> + <xsl:value-of select="text()"/> + <xsl:value-of select="$lf"/> + <xsl:value-of select="$t3"/> + <xsl:text>//</xsl:text> + </xsl:if> + <xsl:value-of select="$lf"/> + </xsl:template> + + <xsl:template match="comment"> + <xsl:call-template name="comment"/> + </xsl:template> + + <xsl:template match="comment" mode ="to"> + <xsl:if test="not(@tonullable) or @tonullable!='true'"> + <xsl:call-template name="comment"/> + </xsl:if> + </xsl:template> + + <xsl:template match="comment" mode ="from"> + <xsl:if test="not(@tonullable) or @tonullable!='true'"> + <xsl:call-template name="comment"/> + </xsl:if> + </xsl:template> + + <xsl:template match="br"> + <xsl:value-of select="$lf"/> + </xsl:template> + + <xsl:template match="br" mode="to"> + <xsl:value-of select="$lf"/> + </xsl:template> + + <xsl:template match="br" mode="from"> + <xsl:value-of select="$lf"/> + </xsl:template> + + <!-- support function --> + <xsl:template name="writeSpaces"> + <xsl:param name="count"/> + <xsl:choose> + <xsl:when test="$count<1"/> + <xsl:when test="$count=1"> + <xsl:value-of select="$s1"/> + </xsl:when> + <xsl:when test="$count=2"> + <xsl:value-of select="$s2"/> + </xsl:when> + <xsl:when test="$count=3"> + <xsl:value-of select="$s3"/> + </xsl:when> + <xsl:when test="$count=4"> + <xsl:value-of select="$s4"/> + </xsl:when> + <xsl:when test="$count=5"> + <xsl:value-of select="$s5"/> + </xsl:when> + <xsl:when test="$count=6"> + <xsl:value-of select="$s6"/> + </xsl:when> + <xsl:when test="$count=7"> + <xsl:value-of select="$s7"/> + </xsl:when> + <xsl:when test="$count=8"> + <xsl:value-of select="$s8"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$s8"/> + <xsl:call-template name ="writeSpaces"> + <xsl:with-param name="count" select="$count - 8"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + +</xsl:stylesheet>