View Javadoc

1   /*
2    * Copyright (c) 2001-2005,
3    * RedVerst Group, ISP RAS http://www.ispras.ru
4    * All rights reserved.
5    *
6    * Redistribution and use in source and binary forms, with or without
7    * modification, are permitted provided that the following conditions are met:
8    *
9    * 1. Redistributions of source code must retain the above copyright notice, this
10   *    list of conditions and the following disclaimer.
11   *
12   * 2. Redistributions in binary form must reproduce the above copyright notice,
13   *    this list of conditions and the following disclaimer in the documentation
14   *    and/or other materials provided with the distribution.
15   *
16   * 3. The names "ATP", "TreeDL", "RedVerst", "ISP RAS"
17   *    may not be used to endorse or promote products derived from this software
18   *    without specific prior written permission.
19   *
20   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
24   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
27   * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   */
31  
32  package com.unitesk.atp.treedl;
33  
34  import com.unitesk.atp.tool.PluginClass;
35  import com.unitesk.atp.treedl.TDL.*;
36  
37  /***
38   * @author <A href="mailto:demakov@ispras.ru">Alexey Demakov</A>
39   * @version $Id: CSharpNodeFactoryGenerator.java,v 1.2 2005/11/20 21:26:55 all-x Exp $
40   */
41  public class CSharpNodeFactoryGenerator
42      extends CSharpInterfaceFactoryGenerator
43  {
44      /***
45       * {@inheritDoc}
46       */
47      public String getVersion()
48      {
49          return PluginClass.getRevision( "$Revision: 1.2 $" ) + "-alpha";
50      }
51  
52      public void visitModule( Module node )
53      {
54          setFunction( "PredefinedTypeName", new PredefinedTypeNameFunction() );
55  
56          generateHeader();
57  
58          int indexOfLastDot = getOutClassName().lastIndexOf( '.' );
59          if( indexOfLastDot != -1 )
60          {
61              txt( "namespace " + getOutClassName().substring( 0, indexOfLastDot ) ); nl();
62              block_nl();
63          }
64  
65          if( node.getOptHeader() != null )
66          {
67              txt( "//-----------------------------------------------------------------------------" ); nl();
68              txt( "// tree header" ); nl();
69              txt( "${optHeader}" ); nl();
70              txt( "//-----------------------------------------------------------------------------" ); nl();
71              nl();
72          }
73  
74          String outShortClassName = getOutClassName().substring( indexOfLastDot + 1 );
75  
76          txt( "public class " + outShortClassName + " : " );
77          String[] implementedInterfaceList = getImplementedInterfaceList();
78          Object oldImplementedInterfaceList
79              = setVariable( "implementedInterfaceList", implementedInterfaceList );
80          list( "i", 0, implementedInterfaceList.length, "${.implementedInterfaceList[i]}", ", " ); nl();
81          setVariable( "implementedInterfaceList", oldImplementedInterfaceList );
82          block();
83          list( "i", 0, node.sizeOptMemberList(), "${optMemberList[i]}", null ); nl();
84          unblock_nl();
85          
86          if( node.getName().sizeIdList() > 1 )
87          {
88              txt( "}" ); nl();
89          }
90      }
91  
92      public void visitNodeTypeDecl( NodeTypeDecl node )
93      {
94          if( node.isAbstract() ) return;
95          
96          nl();
97          txt( "public virtual ${parent.name}.${name} Create${name}" );
98          int constructorParametersCount = 0;
99          for( int i = 0; i < node.sizeFullFieldList(); i++ )
100         {
101             Field field = node.getFullFieldList( i );
102 
103             if( TDL_Module.isConstructorParameter( field ) )
104             {
105                 pushNode( field );
106 
107                 nl();
108                 txtif( constructorParametersCount == 0, "(", "," );
109                 txt( " ${type} ${name}" );
110                 constructorParametersCount++;
111 
112                 popNode();
113             }
114         }
115 
116         switch( constructorParametersCount )
117         {
118         case 0:
119             txt( "()" );
120             break;
121         case 1:
122             txt( " )" );
123             break;
124         default:
125             nl();
126             txt( ")" );
127             break;
128         }
129         nl();
130         block_nl();
131         if( node.isAbstract() )
132         {
133             txt( "throw new InvalidOperationException( \"Create${name}\" );"); nl();
134         } else {
135             txt( "return new ${parent.name}.${name}" );
136             constructorParametersCount = 0;
137             for( int i = 0; i < node.sizeFullFieldList(); i++ )
138             {
139                 Field field = node.getFullFieldList( i );
140 
141                 if( TDL_Module.isConstructorParameter( field ) )
142                 {
143                     pushNode( field );
144 
145                     nl();
146                     txtif( constructorParametersCount == 0, "(", "," );
147                     txt( " ${name}" );
148                     constructorParametersCount++;
149 
150                     popNode();
151                 }
152             }
153 
154             switch( constructorParametersCount )
155             {
156             case 0:
157                 txt( "();" );
158                 break;
159             case 1:
160                 txt( " );" );
161                 break;
162             default:
163                 nl();
164                 txt( ");" );
165                 break;
166             }
167             nl();
168         }
169         unblock_nl();
170     }
171 }