@@ -126,6 +126,7 @@ abstract private class GeneratedType extends Type, GeneratedElement {
126
126
}
127
127
128
128
/** Gets the entire C# stub code for this type. */
129
+ pragma [ nomagic]
129
130
final string getStub ( Assembly assembly ) {
130
131
if this .isDuplicate ( assembly )
131
132
then
@@ -176,8 +177,8 @@ abstract private class GeneratedType extends Type, GeneratedElement {
176
177
language [ monotonicAggregates]
177
178
private string stubMembers ( Assembly assembly ) {
178
179
result =
179
- concat ( Member m |
180
- m = this .getAGeneratedMember ( ) and m . getALocation ( ) = assembly
180
+ concat ( GeneratedMember m |
181
+ m = this .getAGeneratedMember ( assembly )
181
182
|
182
183
stubMember ( m , assembly ) order by m .getName ( )
183
184
)
@@ -201,6 +202,11 @@ abstract private class GeneratedType extends Type, GeneratedElement {
201
202
202
203
private GeneratedMember getAGeneratedMember ( ) { result .getDeclaringType ( ) = this }
203
204
205
+ pragma [ noinline]
206
+ private GeneratedMember getAGeneratedMember ( Assembly assembly ) {
207
+ result = this .getAGeneratedMember ( ) and assembly = result .getALocation ( )
208
+ }
209
+
204
210
final Type getAGeneratedType ( ) {
205
211
result = getAnInterestingBaseType ( )
206
212
or
@@ -733,85 +739,135 @@ private string stubExplicitImplementation(Member c) {
733
739
else result = ""
734
740
}
735
741
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
738
760
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
740
766
then
741
767
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 = ""
746
795
else
747
- if m instanceof Operator and not m instanceof ConversionOperator
796
+ if
797
+ not c .getDeclaringType ( ) instanceof StructEx or
798
+ c .getNumberOfParameters ( ) > 0
748
799
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
+ )
815
871
}
816
872
817
873
private string stubIndexerNameAttribute ( Indexer i ) {
0 commit comments