X-Git-Url: http://nitlanguage.org diff --git a/src/syntax/syntax_base.nit b/src/syntax/syntax_base.nit index deefdad..b5ac33b 100644 --- a/src/syntax/syntax_base.nit +++ b/src/syntax/syntax_base.nit @@ -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