Add default values for some primitive type attributes.
[nit.git] / src / syntax / syntax_base.nit
index deefdad..b5ac33b 100644 (file)
@@ -102,11 +102,13 @@ end
 redef class MMLocalProperty
        # The attached node (if any)
        meth node: PNode do return null
+
+       # Is the concrete method defined as init
+       meth is_init: Bool do return false
 end
 
 # Concrete NIT source attribute
 class MMSrcAttribute
-special MMLocalProperty
 special MMAttribute
        redef readable attr _node: AAttrPropdef
        init(name: Symbol, cla: MMLocalClass, n: AAttrPropdef)
@@ -118,7 +120,6 @@ end
 
 # Concrete NIT source method
 class MMSrcMethod
-special MMLocalProperty
 special MMMethod
 end
 
@@ -126,33 +127,35 @@ end
 class MMAttrImplementationMethod
 special MMSrcMethod
        redef readable attr _node: AAttrPropdef
+       init(name: Symbol, cla: MMLocalClass, n: AAttrPropdef)
+       do
+               super(name, cla)
+               _node = n
+       end
 end
 
 # Concrete NIT source method for an automatic read accesor
 class MMReadImplementationMethod
 special MMAttrImplementationMethod
-
        init(name: Symbol, cla: MMLocalClass, n: AAttrPropdef)
        do
-               super(name, cla)
-               _node = n
+               super(name, cla, n)
        end
 end
 
 # Concrete NIT source method for an automatic write accesor
 class MMWriteImplementationMethod
 special MMAttrImplementationMethod
-
        init(name: Symbol, cla: MMLocalClass, n: AAttrPropdef)
        do
-               super(name, cla)
-               _node = n
+               super(name, cla, n)
        end
 end
 
 # Concrete NIT source method for an explicit method
 class MMMethSrcMethod
 special MMSrcMethod
+       redef meth is_init do return _node isa AConcreteInitPropdef
        redef readable attr _node: AMethPropdef
        init(name: Symbol, cla: MMLocalClass, n: AMethPropdef)
        do
@@ -173,9 +176,22 @@ special MMTypeProperty
        end
 end
 
+# Concrete NIT implicit constructor
+class MMImplicitInit
+special MMMethSrcMethod
+       redef meth is_init do return true
+       readable attr _unassigned_attributes: Array[MMSrcAttribute]
+       readable attr _super_inits: Array[MMLocalProperty]
+       init(cla: MMLocalClass, unassigned_attributes: Array[MMSrcAttribute], super_inits: Array[MMLocalProperty])
+       do
+               super(once "init".to_symbol, cla, null)
+               _unassigned_attributes = unassigned_attributes
+               _super_inits = super_inits
+       end
+end
 
-# Local variable and method parameter
-class Variable
+# Local variables
+abstract class Variable
        # Name of the variable
        readable attr _name: Symbol 
 
@@ -187,15 +203,38 @@ class Variable
 
        redef meth to_s do return _name.to_s
 
+       meth kind: String is abstract
+
        init(n: Symbol, d: PNode)
        do
-               assert n != null
-               assert d != null
+               #assert n != null
+               #assert d != null
                _name = n
                _decl = d
        end
 end
 
+# Variable declared with 'var'
+class VarVariable
+special Variable
+       redef meth kind do return once "variable"
+       init(n: Symbol, d: PNode) do super
+end
+
+# Parameter of method (declared in signature)
+class ParamVariable
+special Variable
+       redef meth kind do return once "parameter"
+       init(n: Symbol, d: PNode) do super
+end
+
+# Automatic variable (like in the 'for' statement)
+class AutoVariable
+special Variable
+       redef meth kind do return once "automatic variable"
+       init(n: Symbol, d: PNode) do super
+end
+
 ###############################################################################
 
 # Visitor used during the syntax analysis
@@ -276,13 +315,20 @@ special Visitor
        # Display an error for a given syntax node
        meth error(n: PNode, s: String)
        do
-               _tc.error("{n.locate}: {s}")
+               _tc.error("{locate(n)}: {s}")
        end
 
        # Display a warning for a given syntax node
        meth warning(n: PNode, s: String)
        do
-               _tc.warning("{n.locate}: {s}")
+               _tc.warning("{locate(n)}: {s}")
+       end
+
+       #
+       meth locate(n: PNode): String
+       do
+               if n != null then return n.locate
+               return _module.filename
        end
 
        # Check conformity and display error
@@ -299,6 +345,26 @@ special Visitor
                error(n, "Type error: expected {stype}, got {subtype}")
                return false
        end
+       
+       # Check that an expression has a static type and that 
+       # Display an error and return false if n is a statement
+       # Require that the static type of n is known
+       meth check_expr(n: PExpr): Bool
+       do
+               # FIXME: The tc.error_count is a workaround since currently there is no way
+               # to distingate statements from buggy expressions: both have a null stype
+               if tc.error_count == 0 and n.stype == null then
+                       error(n, "Type error: expected expression.")
+                       return false
+               end
+               return true
+       end
+
+       # Combine check_conform and check_expr
+       meth check_conform_expr(n: PExpr, stype: MMType): Bool
+       do
+               if check_expr(n) then return check_conform(n, n.stype, stype) else return false
+       end
 
 
        protected init(tc: ToolContext, module: MMSrcModule)
@@ -349,6 +415,9 @@ end
 redef class AMethPropdef
        # Associated method (MM entity)
        meth method: MMMethSrcMethod is abstract
+
+       # Associated 'self' variable
+       meth self_var: ParamVariable is abstract
 end
 
 redef class ATypePropdef
@@ -361,7 +430,7 @@ redef class PParam
        meth position: Int is abstract
 
        # Associated local variable
-       meth variable: Variable is abstract 
+       meth variable: ParamVariable is abstract 
 end
 
 redef class PType
@@ -388,7 +457,7 @@ end
 
 redef class AType
        attr _stype_cache: MMType
-       attr _stype_cached: Bool
+       attr _stype_cached: Bool = false
 
        redef meth get_local_class(v)
        do
@@ -504,12 +573,17 @@ end
 
 redef class AVardeclExpr
        # Assiociated local variable
-       readable writable attr _variable: Variable
+       readable writable attr _variable: VarVariable
 end
 
 redef class AForVardeclExpr
        # Associated automatic local variable
-       readable writable attr _variable: Variable
+       readable writable attr _variable: AutoVariable
+end
+
+redef class ASelfExpr
+       # Associated local variable
+       readable writable attr _variable: ParamVariable 
 end
 
 redef class AVarFormExpr