@@ -126,6 +126,7 @@ abstract private class GeneratedType extends Type, GeneratedElement {
126126 }
127127
128128 /** Gets the entire C# stub code for this type. */
129+ pragma [ nomagic]
129130 final string getStub ( Assembly assembly ) {
130131 if this .isDuplicate ( assembly )
131132 then
@@ -176,8 +177,8 @@ abstract private class GeneratedType extends Type, GeneratedElement {
176177 language [ monotonicAggregates]
177178 private string stubMembers ( Assembly assembly ) {
178179 result =
179- concat ( Member m |
180- m = this .getAGeneratedMember ( ) and m . getALocation ( ) = assembly
180+ concat ( GeneratedMember m |
181+ m = this .getAGeneratedMember ( assembly )
181182 |
182183 stubMember ( m , assembly ) order by m .getName ( )
183184 )
@@ -201,6 +202,11 @@ abstract private class GeneratedType extends Type, GeneratedElement {
201202
202203 private GeneratedMember getAGeneratedMember ( ) { result .getDeclaringType ( ) = this }
203204
205+ pragma [ noinline]
206+ private GeneratedMember getAGeneratedMember ( Assembly assembly ) {
207+ result = this .getAGeneratedMember ( ) and assembly = result .getALocation ( )
208+ }
209+
204210 final Type getAGeneratedType ( ) {
205211 result = getAnInterestingBaseType ( )
206212 or
@@ -733,85 +739,135 @@ private string stubExplicitImplementation(Member c) {
733739 else result = ""
734740}
735741
736- private string stubMember ( Member m , Assembly assembly ) {
737- if m instanceof Method
742+ pragma [ noinline]
743+ private string stubMethod ( Method m , Assembly assembly ) {
744+ m instanceof GeneratedMember and
745+ m .getALocation ( ) = assembly and
746+ if not m .getDeclaringType ( ) instanceof Enum
747+ then
748+ result =
749+ " " + stubModifiers ( m ) + stubClassName ( m .( Method ) .getReturnType ( ) ) + " " +
750+ stubExplicitImplementation ( m ) + m .getName ( ) + stubGenericMethodParams ( m ) + "(" +
751+ stubParameters ( m ) + ")" + stubTypeParametersConstraints ( m ) + stubImplementation ( m ) + ";\n"
752+ else result = " // Stub generator skipped method: " + m .getName ( ) + "\n"
753+ }
754+
755+ pragma [ noinline]
756+ private string stubOperator ( Operator o , Assembly assembly ) {
757+ o instanceof GeneratedMember and
758+ o .getALocation ( ) = assembly and
759+ if o instanceof ConversionOperator
738760 then
739- if not m .getDeclaringType ( ) instanceof Enum
761+ result =
762+ " " + stubModifiers ( o ) + stubExplicit ( o ) + "operator " + stubClassName ( o .getReturnType ( ) ) +
763+ "(" + stubParameters ( o ) + ") => throw null;\n"
764+ else
765+ if not o .getDeclaringType ( ) instanceof Enum
740766 then
741767 result =
742- " " + stubModifiers ( m ) + stubClassName ( m .( Method ) .getReturnType ( ) ) + " " +
743- stubExplicitImplementation ( m ) + m .getName ( ) + stubGenericMethodParams ( m ) + "(" +
744- stubParameters ( m ) + ")" + stubTypeParametersConstraints ( m ) + stubImplementation ( m ) + ";\n"
745- else result = " // Stub generator skipped method: " + m .getName ( ) + "\n"
768+ " " + stubModifiers ( o ) + stubClassName ( o .getReturnType ( ) ) + " operator " + o .getName ( ) +
769+ "(" + stubParameters ( o ) + ") => throw null;\n"
770+ else result = " // Stub generator skipped operator: " + o .getName ( ) + "\n"
771+ }
772+
773+ pragma [ noinline]
774+ private string stubEnumConstant ( EnumConstant ec , Assembly assembly ) {
775+ ec instanceof GeneratedMember and
776+ ec .getALocation ( ) = assembly and
777+ result = " " + ec .getName ( ) + ",\n"
778+ }
779+
780+ pragma [ noinline]
781+ private string stubProperty ( Property p , Assembly assembly ) {
782+ p instanceof GeneratedMember and
783+ p .getALocation ( ) = assembly and
784+ result =
785+ " " + stubModifiers ( p ) + stubClassName ( p .getType ( ) ) + " " + stubExplicitImplementation ( p ) +
786+ p .getName ( ) + " { " + stubGetter ( p ) + stubSetter ( p ) + "}\n"
787+ }
788+
789+ pragma [ noinline]
790+ private string stubConstructor ( Constructor c , Assembly assembly ) {
791+ c instanceof GeneratedMember and
792+ c .getALocation ( ) = assembly and
793+ if c .getDeclaringType ( ) instanceof Enum
794+ then result = ""
746795 else
747- if m instanceof Operator and not m instanceof ConversionOperator
796+ if
797+ not c .getDeclaringType ( ) instanceof StructEx or
798+ c .getNumberOfParameters ( ) > 0
748799 then
749- if not m .getDeclaringType ( ) instanceof Enum
750- then
751- result =
752- " " + stubModifiers ( m ) + stubClassName ( m .( Operator ) .getReturnType ( ) ) + " operator " +
753- m .getName ( ) + "(" + stubParameters ( m ) + ") => throw null;\n"
754- else result = " // Stub generator skipped operator: " + m .getName ( ) + "\n"
755- else
756- if m instanceof ConversionOperator
757- then
758- result =
759- " " + stubModifiers ( m ) + stubExplicit ( m ) + "operator " +
760- stubClassName ( m .( ConversionOperator ) .getReturnType ( ) ) + "(" + stubParameters ( m ) +
761- ") => throw null;\n"
762- else
763- if m instanceof EnumConstant
764- then result = " " + m .( EnumConstant ) .getName ( ) + ",\n"
765- else
766- if m instanceof Property
767- then
768- result =
769- " " + stubModifiers ( m ) + stubClassName ( m .( Property ) .getType ( ) ) + " " +
770- stubExplicitImplementation ( m ) + m .getName ( ) + " { " + stubGetter ( m ) + stubSetter ( m ) +
771- "}\n"
772- else
773- if m instanceof Constructor
774- then
775- if m .getDeclaringType ( ) instanceof Enum
776- then result = ""
777- else
778- if
779- not m .getDeclaringType ( ) instanceof StructEx or
780- m .( Constructor ) .getNumberOfParameters ( ) > 0
781- then
782- result =
783- " " + stubModifiers ( m ) + m .getName ( ) + "(" + stubParameters ( m ) + ")" +
784- stubConstructorInitializer ( m ) + " => throw null;\n"
785- else result = " // Stub generator skipped constructor \n"
786- else
787- if m instanceof Indexer
788- then
789- result =
790- " " + stubIndexerNameAttribute ( m ) + stubModifiers ( m ) +
791- stubClassName ( m .( Indexer ) .getType ( ) ) + " " + stubExplicitImplementation ( m ) +
792- "this[" + stubParameters ( m ) + "] { " + stubGetter ( m ) + stubSetter ( m ) + "}\n"
793- else
794- if m instanceof Field // EnumConstants are already stubbed
795- then
796- exists ( string impl |
797- ( if m .( Field ) .isConst ( ) then impl = " = default" else impl = "" ) and
798- result =
799- " " + stubModifiers ( m ) + stubClassName ( m .( Field ) .getType ( ) ) + " " +
800- escapeIfKeyword ( m .( Field ) .getName ( ) ) + impl + ";\n"
801- )
802- else
803- if m instanceof Event
804- then
805- result =
806- " " + stubModifiers ( m ) + "event " + stubClassName ( m .( Event ) .getType ( ) ) +
807- " " + stubExplicitImplementation ( m ) + m .getName ( ) + stubEventAccessors ( m ) +
808- "\n"
809- else
810- if m instanceof GeneratedType
811- then result = m .( GeneratedType ) .getStub ( assembly ) + "\n"
812- else
813- result =
814- " // ERR: Stub generator didn't handle member: " + m .getName ( ) + "\n"
800+ result =
801+ " " + stubModifiers ( c ) + c .getName ( ) + "(" + stubParameters ( c ) + ")" +
802+ stubConstructorInitializer ( c ) + " => throw null;\n"
803+ else result = " // Stub generator skipped constructor \n"
804+ }
805+
806+ pragma [ noinline]
807+ private string stubIndexer ( Indexer i , Assembly assembly ) {
808+ i instanceof GeneratedMember and
809+ i .getALocation ( ) = assembly and
810+ result =
811+ " " + stubIndexerNameAttribute ( i ) + stubModifiers ( i ) + stubClassName ( i .getType ( ) ) + " " +
812+ stubExplicitImplementation ( i ) + "this[" + stubParameters ( i ) + "] { " + stubGetter ( i ) +
813+ stubSetter ( i ) + "}\n"
814+ }
815+
816+ pragma [ noinline]
817+ private string stubField ( Field f , Assembly assembly ) {
818+ f instanceof GeneratedMember and
819+ f .getALocation ( ) = assembly and
820+ not f instanceof EnumConstant and // EnumConstants are already stubbed
821+ exists ( string impl |
822+ ( if f .isConst ( ) then impl = " = default" else impl = "" ) and
823+ result =
824+ " " + stubModifiers ( f ) + stubClassName ( f .getType ( ) ) + " " + escapeIfKeyword ( f .getName ( ) ) +
825+ impl + ";\n"
826+ )
827+ }
828+
829+ pragma [ noinline]
830+ private string stubEvent ( Event e , Assembly assembly ) {
831+ e instanceof GeneratedMember and
832+ e .getALocation ( ) = assembly and
833+ result =
834+ " " + stubModifiers ( e ) + "event " + stubClassName ( e .getType ( ) ) + " " +
835+ stubExplicitImplementation ( e ) + e .getName ( ) + stubEventAccessors ( e ) + "\n"
836+ }
837+
838+ pragma [ nomagic]
839+ private string stubMember ( GeneratedMember m , Assembly assembly ) {
840+ result = stubMethod ( m , assembly )
841+ or
842+ result = stubOperator ( m , assembly )
843+ or
844+ result = stubEnumConstant ( m , assembly )
845+ or
846+ result = stubProperty ( m , assembly )
847+ or
848+ result = stubConstructor ( m , assembly )
849+ or
850+ result = stubIndexer ( m , assembly )
851+ or
852+ result = stubField ( m , assembly )
853+ or
854+ result = stubEvent ( m , assembly )
855+ or
856+ not m instanceof Method and
857+ not m instanceof Operator and
858+ not m instanceof EnumConstant and
859+ not m instanceof Property and
860+ not m instanceof Constructor and
861+ not m instanceof Indexer and
862+ not m instanceof Field and
863+ not m instanceof Event and
864+ m .getALocation ( ) = assembly and
865+ (
866+ result = m .( GeneratedType ) .getStub ( assembly ) + "\n"
867+ or
868+ not m instanceof GeneratedType and
869+ result = " // ERR: Stub generator didn't handle member: " + m .getName ( ) + "\n"
870+ )
815871}
816872
817873private string stubIndexerNameAttribute ( Indexer i ) {
0 commit comments