From 4bbfeabf3421c3103dfdff710d0a1291001c1cc3 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Tue, 7 Jul 2009 16:34:24 -0400 Subject: [PATCH] syntax: if absent, create classes Object and Bool in root module Signed-off-by: Jean Privat --- src/syntax/mmbuilder.nit | 21 +++++++++++++++++++++ src/syntax/syntax_base.nit | 8 ++++++-- tests/base_no_object.nit | 13 +++++++++++++ tests/sav/base_no_object.sav | 1 + tests/sav/base_no_object_alt1.sav | 2 ++ 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/base_no_object.nit create mode 100644 tests/sav/base_no_object.sav create mode 100644 tests/sav/base_no_object_alt1.sav diff --git a/src/syntax/mmbuilder.nit b/src/syntax/mmbuilder.nit index de5ccbe..3944f03 100644 --- a/src/syntax/mmbuilder.nit +++ b/src/syntax/mmbuilder.nit @@ -45,6 +45,10 @@ redef class MMSrcModule mmbv.visit(node) if tc.error_count > 0 then exit(1) + if mhe.direct_greaters.is_empty then + process_default_classes(tc) + end + # Import unrefined local classes and attach them to global classes import_local_classes @@ -120,6 +124,23 @@ redef class MMSrcModule if tc.error_count > 0 then exit(1) end + + # Create some primitive default classes if they do not exists + fun process_default_classes(tc: ToolContext) + do + var name = once ("Object".to_symbol) + if not has_global_class_named(name) then + var c = new MMSrcLocalClass(self, name, null, 0) + c.new_global + src_local_classes[name] = c + end + name = once ("Bool".to_symbol) + if not has_global_class_named(name) then + var c = new MMSrcLocalClass(self, name, null, 0) + c.new_global + src_local_classes[name] = c + end + end end redef class MMLocalClass diff --git a/src/syntax/syntax_base.nit b/src/syntax/syntax_base.nit index 78cf92a..881e6aa 100644 --- a/src/syntax/syntax_base.nit +++ b/src/syntax/syntax_base.nit @@ -68,10 +68,14 @@ special MMConcreteClass # Concrete NIT source properties by name readable var _src_local_properties: Map[Symbol, MMLocalProperty] - init(mod: MMSrcModule, n: Symbol, cla: PClassdef, a: Int) + init(mod: MMSrcModule, n: Symbol, cla: nullable PClassdef, a: Int) do super(mod, n, a) - _nodes = [cla] + if cla == null then + _nodes = new Array[PClassdef] + else + _nodes = [cla] + end _src_local_properties = new HashMap[Symbol, MMLocalProperty] end end diff --git a/tests/base_no_object.nit b/tests/base_no_object.nit new file mode 100644 index 0000000..8ed75ce --- /dev/null +++ b/tests/base_no_object.nit @@ -0,0 +1,13 @@ +import end + +class Int + fun output is intern +end + +class A + fun foo do 1.output +end + +var a = new A +a.foo +#alt1# if a is a then 2.output diff --git a/tests/sav/base_no_object.sav b/tests/sav/base_no_object.sav new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/tests/sav/base_no_object.sav @@ -0,0 +1 @@ +1 diff --git a/tests/sav/base_no_object_alt1.sav b/tests/sav/base_no_object_alt1.sav new file mode 100644 index 0000000..1191247 --- /dev/null +++ b/tests/sav/base_no_object_alt1.sav @@ -0,0 +1,2 @@ +1 +2 -- 1.7.9.5