diff trunk/src/dil/ast/Parameters.d @ 608:fac9e8b258fc

Moved dil.ast.Parameter to dil.ast.Parameters.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sun, 06 Jan 2008 15:26:03 +0100
parents trunk/src/dil/ast/Parameter.d@9daa6c34c45a
children b2fc028d8b55
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/dil/ast/Parameters.d	Sun Jan 06 15:26:03 2008 +0100
@@ -0,0 +1,194 @@
+/++
+  Author: Aziz Köksal
+  License: GPL3
++/
+module dil.ast.Parameters;
+
+import dil.ast.Node;
+import dil.ast.Types;
+import dil.ast.Expressions;
+import dil.lexer.Identifier;
+import dil.Enums;
+
+class Parameter : Node
+{
+  StorageClass stc;
+  TypeNode type;
+  Identifier* ident;
+  Expression defValue;
+
+  this(StorageClass stc, TypeNode type, Identifier* ident, Expression defValue)
+  {
+    super(NodeCategory.Other);
+    mixin(set_kind);
+    // type can be null when param in foreach statement
+    addOptChild(type);
+    addOptChild(defValue);
+
+    this.stc = stc;
+    this.type = type;
+    this.ident = ident;
+    this.defValue = defValue;
+  }
+
+  /// func(...) or func(int[] values ...)
+  bool isVariadic()
+  {
+    return !!(stc & StorageClass.Variadic);
+  }
+
+  /// func(...)
+  bool isOnlyVariadic()
+  {
+    return stc == StorageClass.Variadic &&
+           type is null && ident is null;
+  }
+}
+
+class Parameters : Node
+{
+  this()
+  {
+    super(NodeCategory.Other);
+    mixin(set_kind);
+  }
+
+  bool hasVariadic()
+  {
+    if (children.length != 0)
+      return items[$-1].isVariadic();
+    return false;
+  }
+
+  void opCatAssign(Parameter param)
+  { addChild(param); }
+
+  Parameter[] items()
+  { return cast(Parameter[])children; }
+
+  size_t length()
+  { return children.length; }
+}
+
+/*********************
+  Template parameters:
+*/
+
+abstract class TemplateParameter : Node
+{
+  Identifier* ident;
+  this(Identifier* ident)
+  {
+    super(NodeCategory.Other);
+    this.ident = ident;
+  }
+}
+
+class TemplateAliasParameter : TemplateParameter
+{
+  TypeNode specType, defType;
+  this(Identifier* ident, TypeNode specType, TypeNode defType)
+  {
+    super(ident);
+    mixin(set_kind);
+    addOptChild(specType);
+    addOptChild(defType);
+    this.ident = ident;
+    this.specType = specType;
+    this.defType = defType;
+  }
+}
+
+class TemplateTypeParameter : TemplateParameter
+{
+  TypeNode specType, defType;
+  this(Identifier* ident, TypeNode specType, TypeNode defType)
+  {
+    super(ident);
+    mixin(set_kind);
+    addOptChild(specType);
+    addOptChild(defType);
+    this.ident = ident;
+    this.specType = specType;
+    this.defType = defType;
+  }
+}
+
+version(D2)
+{
+class TemplateThisParameter : TemplateParameter
+{
+  TypeNode specType, defType;
+  this(Identifier* ident, TypeNode specType, TypeNode defType)
+  {
+    super(ident);
+    mixin(set_kind);
+    addOptChild(specType);
+    addOptChild(defType);
+    this.ident = ident;
+    this.specType = specType;
+    this.defType = defType;
+  }
+}
+}
+
+class TemplateValueParameter : TemplateParameter
+{
+  TypeNode valueType;
+  Expression specValue, defValue;
+  this(TypeNode valueType, Identifier* ident, Expression specValue, Expression defValue)
+  {
+    super(ident);
+    mixin(set_kind);
+    addChild(valueType);
+    addOptChild(specValue);
+    addOptChild(defValue);
+    this.valueType = valueType;
+    this.ident = ident;
+    this.specValue = specValue;
+    this.defValue = defValue;
+  }
+}
+
+class TemplateTupleParameter : TemplateParameter
+{
+  this(Identifier* ident)
+  {
+    super(ident);
+    mixin(set_kind);
+    this.ident = ident;
+  }
+}
+
+class TemplateParameters : Node
+{
+  this()
+  {
+    super(NodeCategory.Other);
+    mixin(set_kind);
+  }
+
+  void opCatAssign(TemplateParameter parameter)
+  {
+    addChild(parameter);
+  }
+
+  TemplateParameter[] items()
+  {
+    return cast(TemplateParameter[])children;
+  }
+}
+
+class TemplateArguments : Node
+{
+  this()
+  {
+    super(NodeCategory.Other);
+    mixin(set_kind);
+  }
+
+  void opCatAssign(Node argument)
+  {
+    addChild(argument);
+  }
+}