Skip to content

Commit 73b8c89

Browse files
committed
[py] Handle Exception objects.
Fix #228
1 parent 3c7293d commit 73b8c89

10 files changed

Lines changed: 77 additions & 12 deletions

File tree

AST.fu

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,7 @@ public class FuSystem : FuScope
16001600
internal FuType# PrintableType = new FuPrintableType { Name = "printable" };
16011601
internal FuClass# ArrayPtrClass = FuClass.New(FuCallType.Normal, FuId.ArrayPtrClass, "ArrayPtr", 1);
16021602
internal FuClass# ArrayStorageClass = FuClass.New(FuCallType.Normal, FuId.ArrayStorageClass, "ArrayStorage", 1);
1603+
internal FuClass# ExceptionClass = FuClass.New(FuCallType.Normal, FuId.ExceptionClass, "Exception");
16031604
internal FuEnum# RegexOptionsEnum;
16041605
internal FuReadWriteClassType# LockPtrType = new FuReadWriteClassType();
16051606

@@ -1759,9 +1760,8 @@ public class FuSystem : FuScope
17591760
ArrayStorageClass.Add(FuMethodGroup.New(
17601761
FuMethod.New(ArrayStorageClass, FuVisibility.NumericElementType, FuCallType.Normal, VoidType, FuId.ArraySortAll, "Sort", true),
17611762
arraySortPart));
1762-
FuClass# exceptionClass = FuClass.New(FuCallType.Normal, FuId.ExceptionClass, "Exception");
1763-
exceptionClass.IsPublic = true;
1764-
Add(exceptionClass);
1763+
ExceptionClass.IsPublic = true;
1764+
Add(ExceptionClass);
17651765

17661766
FuType# typeParam0NotFinal = new FuType { Id = FuId.TypeParam0NotFinal, Name = "T" };
17671767
FuType# typeParam0Predicate = new FuType { Id = FuId.TypeParam0Predicate, Name = "Predicate<T>" };

GenCpp.fu

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,9 @@ public class GenCpp : GenCCpp
281281
Write("const ");
282282
if (klass.Class.TypeParameterCount == 0) {
283283
switch (klass.Class.Id) {
284+
case FuId.ExceptionClass:
285+
WriteExceptionClass(klass.Class);
286+
break;
284287
case FuId.TextWriterClass:
285288
Include("iostream");
286289
Write("std::ostream");

GenPy.fu

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ public class GenPy : GenPySwift
284284
nullable = nullable ? !(klass is FuStorageType) : klass.Nullable;
285285
switch (klass.Class.Id) {
286286
case FuId.None:
287+
case FuId.ExceptionClass:
287288
if (nullable && !this.WrittenTypes.Contains(klass.Class)) {
288289
WriteChar('"');
289290
WriteName(klass.Class);
@@ -1742,6 +1743,7 @@ public class GenPy : GenPySwift
17421743
public override void WriteProgram!(FuProgram program, string outputFile, string namespace)
17431744
{
17441745
this.WrittenTypes.Clear();
1746+
this.WrittenTypes.Add(program.System.ExceptionClass);
17451747
this.TimeNs = false;
17461748
this.SwitchBreak = false;
17471749
OpenStringWriter();

GenSwift.fu

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ public class GenSwift : GenPySwift
235235
WriteType(klass.GetElementType());
236236
WriteChar(']');
237237
break;
238+
case FuId.ExceptionClass:
239+
WriteExceptionClass(klass.Class);
240+
break;
238241
case FuId.HashSetClass:
239242
case FuId.SortedSetClass:
240243
Write("Set<");

GenTs.fu

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ public class GenTs : GenJs
100100
WriteArrayElementType(klass.GetElementType());
101101
Write("Array");
102102
break;
103+
case FuId.ExceptionClass:
104+
WriteExceptionClass(klass.Class);
105+
break;
103106
case FuId.HashSetClass:
104107
case FuId.SortedSetClass:
105108
Write("Set<");

libfut.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2812,9 +2812,8 @@ FuSystem::FuSystem()
28122812
this->arrayStorageClass->add(FuMethodGroup::new_(FuMethod::new_(this->arrayStorageClass.get(), FuVisibility::public_, FuCallType::normal, this->voidType, FuId::arrayFillAll, "Fill", true, FuVar::new_(this->typeParam0, "value")), arrayFillPart));
28132813
this->arrayStorageClass->add(FuProperty::new_(this->nIntType, FuId::arrayLength, "Length"));
28142814
this->arrayStorageClass->add(FuMethodGroup::new_(FuMethod::new_(this->arrayStorageClass.get(), FuVisibility::numericElementType, FuCallType::normal, this->voidType, FuId::arraySortAll, "Sort", true), arraySortPart));
2815-
std::shared_ptr<FuClass> exceptionClass = FuClass::new_(FuCallType::normal, FuId::exceptionClass, "Exception");
2816-
exceptionClass->isPublic = true;
2817-
add(exceptionClass);
2815+
this->exceptionClass->isPublic = true;
2816+
add(this->exceptionClass);
28182817
std::shared_ptr<FuType> typeParam0NotFinal = std::make_shared<FuType>();
28192818
typeParam0NotFinal->id = FuId::typeParam0NotFinal;
28202819
typeParam0NotFinal->name = "T";
@@ -14274,6 +14273,9 @@ void GenCpp::writeClassType(const FuClassType * klass)
1427414273
write("const ");
1427514274
if (klass->class_->typeParameterCount == 0) {
1427614275
switch (klass->class_->id) {
14276+
case FuId::exceptionClass:
14277+
writeExceptionClass(klass->class_);
14278+
break;
1427714279
case FuId::textWriterClass:
1427814280
include("iostream");
1427914281
write("std::ostream");
@@ -21782,6 +21784,9 @@ void GenTs::writeType(const FuType * type, bool readOnly)
2178221784
writeArrayElementType(klass->getElementType().get());
2178321785
write("Array");
2178421786
break;
21787+
case FuId::exceptionClass:
21788+
writeExceptionClass(klass->class_);
21789+
break;
2178521790
case FuId::hashSetClass:
2178621791
case FuId::sortedSetClass:
2178721792
write("Set<");
@@ -22526,6 +22531,9 @@ void GenSwift::writeClassName(const FuClassType * klass)
2252622531
writeType(klass->getElementType().get());
2252722532
writeChar(']');
2252822533
break;
22534+
case FuId::exceptionClass:
22535+
writeExceptionClass(klass->class_);
22536+
break;
2252922537
case FuId::hashSetClass:
2253022538
case FuId::sortedSetClass:
2253122539
write("Set<");
@@ -24562,6 +24570,7 @@ void GenPy::writeTypeAnnotation(const FuType * type, bool nullable)
2456224570
nullable = nullable ? !dynamic_cast<const FuStorageType *>(klass) : klass->nullable;
2456324571
switch (klass->class_->id) {
2456424572
case FuId::none:
24573+
case FuId::exceptionClass:
2456524574
if (nullable && !this->writtenTypes.contains(klass->class_)) {
2456624575
writeChar('"');
2456724576
writeName(klass->class_);
@@ -26027,6 +26036,7 @@ void GenPy::writeMain(const FuMethod * main)
2602726036
void GenPy::writeProgram(const FuProgram * program, std::string_view outputFile, std::string_view namespace_)
2602826037
{
2602926038
this->writtenTypes.clear();
26039+
this->writtenTypes.insert(program->system->exceptionClass.get());
2603026040
this->timeNs = false;
2603126041
this->switchBreak = false;
2603226042
openStringWriter();

libfut.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3302,9 +3302,8 @@ internal FuSystem()
33023302
this.ArrayStorageClass.Add(FuMethodGroup.New(FuMethod.New(this.ArrayStorageClass, FuVisibility.Public, FuCallType.Normal, this.VoidType, FuId.ArrayFillAll, "Fill", true, FuVar.New(this.TypeParam0, "value")), arrayFillPart));
33033303
this.ArrayStorageClass.Add(FuProperty.New(this.NIntType, FuId.ArrayLength, "Length"));
33043304
this.ArrayStorageClass.Add(FuMethodGroup.New(FuMethod.New(this.ArrayStorageClass, FuVisibility.NumericElementType, FuCallType.Normal, this.VoidType, FuId.ArraySortAll, "Sort", true), arraySortPart));
3305-
FuClass exceptionClass = FuClass.New(FuCallType.Normal, FuId.ExceptionClass, "Exception");
3306-
exceptionClass.IsPublic = true;
3307-
Add(exceptionClass);
3305+
this.ExceptionClass.IsPublic = true;
3306+
Add(this.ExceptionClass);
33083307
FuType typeParam0NotFinal = new FuType { Id = FuId.TypeParam0NotFinal, Name = "T" };
33093308
FuType typeParam0Predicate = new FuType { Id = FuId.TypeParam0Predicate, Name = "Predicate<T>" };
33103309
FuClass listClass = AddCollection(FuId.ListClass, "List", 1, FuId.ListClear, FuId.ListCount);
@@ -3499,6 +3498,8 @@ internal FuSystem()
34993498

35003499
internal FuClass ArrayStorageClass = FuClass.New(FuCallType.Normal, FuId.ArrayStorageClass, "ArrayStorage", 1);
35013500

3501+
internal FuClass ExceptionClass = FuClass.New(FuCallType.Normal, FuId.ExceptionClass, "Exception");
3502+
35023503
internal FuEnum RegexOptionsEnum;
35033504

35043505
internal FuReadWriteClassType LockPtrType = new FuReadWriteClassType();
@@ -14623,6 +14624,9 @@ void WriteClassType(FuClassType klass)
1462314624
Write("const ");
1462414625
if (klass.Class.TypeParameterCount == 0) {
1462514626
switch (klass.Class.Id) {
14627+
case FuId.ExceptionClass:
14628+
WriteExceptionClass(klass.Class);
14629+
break;
1462614630
case FuId.TextWriterClass:
1462714631
Include("iostream");
1462814632
Write("std::ostream");
@@ -22449,6 +22453,9 @@ void WriteType(FuType type, bool readOnly = false)
2244922453
WriteArrayElementType(klass.GetElementType());
2245022454
Write("Array");
2245122455
break;
22456+
case FuId.ExceptionClass:
22457+
WriteExceptionClass(klass.Class);
22458+
break;
2245222459
case FuId.HashSetClass:
2245322460
case FuId.SortedSetClass:
2245422461
Write("Set<");
@@ -23305,6 +23312,9 @@ void WriteClassName(FuClassType klass)
2330523312
WriteType(klass.GetElementType());
2330623313
WriteChar(']');
2330723314
break;
23315+
case FuId.ExceptionClass:
23316+
WriteExceptionClass(klass.Class);
23317+
break;
2330823318
case FuId.HashSetClass:
2330923319
case FuId.SortedSetClass:
2331023320
Write("Set<");
@@ -25428,6 +25438,7 @@ void WriteTypeAnnotation(FuType type, bool nullable = false)
2542825438
nullable = nullable ? !(klass is FuStorageType) : klass.Nullable;
2542925439
switch (klass.Class.Id) {
2543025440
case FuId.None:
25441+
case FuId.ExceptionClass:
2543125442
if (nullable && !this.WrittenTypes.Contains(klass.Class)) {
2543225443
WriteChar('"');
2543325444
WriteName(klass.Class);
@@ -26875,6 +26886,7 @@ void WriteMain(FuMethod main)
2687526886
public override void WriteProgram(FuProgram program, string outputFile, string namespace_)
2687626887
{
2687726888
this.WrittenTypes.Clear();
26889+
this.WrittenTypes.Add(program.System.ExceptionClass);
2687826890
this.TimeNs = false;
2687926891
this.SwitchBreak = false;
2688026892
OpenStringWriter();

libfut.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,6 +2127,7 @@ class FuSystem : public FuScope
21272127
std::shared_ptr<FuType> printableType = std::make_shared<FuPrintableType>();
21282128
std::shared_ptr<FuClass> arrayPtrClass = FuClass::new_(FuCallType::normal, FuId::arrayPtrClass, "ArrayPtr", 1);
21292129
std::shared_ptr<FuClass> arrayStorageClass = FuClass::new_(FuCallType::normal, FuId::arrayStorageClass, "ArrayStorage", 1);
2130+
std::shared_ptr<FuClass> exceptionClass = FuClass::new_(FuCallType::normal, FuId::exceptionClass, "Exception");
21302131
std::shared_ptr<FuEnum> regexOptionsEnum;
21312132
std::unique_ptr<FuReadWriteClassType> lockPtrType = std::make_unique<FuReadWriteClassType>();
21322133
std::shared_ptr<FuLiteralLong> newLiteralLong(int64_t value, int loc = 0) const;
@@ -2138,6 +2139,7 @@ class FuSystem : public FuScope
21382139
friend FuParser;
21392140
friend FuSema;
21402141
friend GenBase;
2142+
friend GenPy;
21412143
friend GenSwift;
21422144
friend GenTs;
21432145
private:

libfut.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3548,9 +3548,8 @@ export class FuSystem extends FuScope
35483548
this.arrayStorageClass.add(FuMethodGroup.new(FuMethod.new(this.arrayStorageClass, FuVisibility.PUBLIC, FuCallType.NORMAL, this.voidType, FuId.ARRAY_FILL_ALL, "Fill", true, FuVar.new(this.#typeParam0, "value")), arrayFillPart));
35493549
this.arrayStorageClass.add(FuProperty.new(this.nIntType, FuId.ARRAY_LENGTH, "Length"));
35503550
this.arrayStorageClass.add(FuMethodGroup.new(FuMethod.new(this.arrayStorageClass, FuVisibility.NUMERIC_ELEMENT_TYPE, FuCallType.NORMAL, this.voidType, FuId.ARRAY_SORT_ALL, "Sort", true), arraySortPart));
3551-
let exceptionClass = FuClass.new(FuCallType.NORMAL, FuId.EXCEPTION_CLASS, "Exception");
3552-
exceptionClass.isPublic = true;
3553-
this.add(exceptionClass);
3551+
this.exceptionClass.isPublic = true;
3552+
this.add(this.exceptionClass);
35543553
let typeParam0NotFinal = Object.assign(new FuType(), { id: FuId.TYPE_PARAM0_NOT_FINAL, name: "T" });
35553554
let typeParam0Predicate = Object.assign(new FuType(), { id: FuId.TYPE_PARAM0_PREDICATE, name: "Predicate<T>" });
35563555
let listClass = this.#addCollection(FuId.LIST_CLASS, "List", 1, FuId.LIST_CLEAR, FuId.LIST_COUNT);
@@ -3724,6 +3723,7 @@ export class FuSystem extends FuScope
37243723
printableType = Object.assign(new FuPrintableType(), { name: "printable" });
37253724
arrayPtrClass = FuClass.new(FuCallType.NORMAL, FuId.ARRAY_PTR_CLASS, "ArrayPtr", 1);
37263725
arrayStorageClass = FuClass.new(FuCallType.NORMAL, FuId.ARRAY_STORAGE_CLASS, "ArrayStorage", 1);
3726+
exceptionClass = FuClass.new(FuCallType.NORMAL, FuId.EXCEPTION_CLASS, "Exception");
37273727
regexOptionsEnum;
37283728
lockPtrType = new FuReadWriteClassType();
37293729

@@ -15118,6 +15118,9 @@ export class GenCpp extends GenCCpp
1511815118
this.write("const ");
1511915119
if (klass.class.typeParameterCount == 0) {
1512015120
switch (klass.class.id) {
15121+
case FuId.EXCEPTION_CLASS:
15122+
this.writeExceptionClass(klass.class);
15123+
break;
1512115124
case FuId.TEXT_WRITER_CLASS:
1512215125
this.include("iostream");
1512315126
this.write("std::ostream");
@@ -23069,6 +23072,9 @@ export class GenTs extends GenJs
2306923072
this.writeArrayElementType(klass.getElementType());
2307023073
this.write("Array");
2307123074
break;
23075+
case FuId.EXCEPTION_CLASS:
23076+
this.writeExceptionClass(klass.class);
23077+
break;
2307223078
case FuId.HASH_SET_CLASS:
2307323079
case FuId.SORTED_SET_CLASS:
2307423080
this.write("Set<");
@@ -23939,6 +23945,9 @@ export class GenSwift extends GenPySwift
2393923945
this.#writeType(klass.getElementType());
2394023946
this.writeChar(93);
2394123947
break;
23948+
case FuId.EXCEPTION_CLASS:
23949+
this.writeExceptionClass(klass.class);
23950+
break;
2394223951
case FuId.HASH_SET_CLASS:
2394323952
case FuId.SORTED_SET_CLASS:
2394423953
this.write("Set<");
@@ -26083,6 +26092,7 @@ export class GenPy extends GenPySwift
2608326092
nullable = nullable ? !(klass instanceof FuStorageType) : klass.nullable;
2608426093
switch (klass.class.id) {
2608526094
case FuId.NONE:
26095+
case FuId.EXCEPTION_CLASS:
2608626096
if (nullable && !this.writtenTypes.has(klass.class)) {
2608726097
this.writeChar(34);
2608826098
this.writeName(klass.class);
@@ -27554,6 +27564,7 @@ export class GenPy extends GenPySwift
2755427564
writeProgram(program, outputFile, namespace)
2755527565
{
2755627566
this.writtenTypes.clear();
27567+
this.writtenTypes.add(program.system.exceptionClass);
2755727568
this.#timeNs = false;
2755827569
this.#switchBreak = false;
2755927570
this.openStringWriter();

test/ExceptionPtr.fu

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
public class FooException : Exception
2+
{
3+
}
4+
5+
public class BarException : FooException
6+
{
7+
}
8+
9+
public static class Test
10+
{
11+
public static bool IsFooException(Exception e) => e is FooException; //FAIL: c cl
12+
13+
public static bool IsBarException(FooException e) => e is BarException;
14+
15+
public static bool Run()
16+
{
17+
return true;
18+
}
19+
}

0 commit comments

Comments
 (0)