diff --git a/ddl/Definitions.hs b/ddl/Definitions.hs
index 04f461c..1849ed2 100644
--- a/ddl/Definitions.hs
+++ b/ddl/Definitions.hs
@@ -459,12 +459,17 @@ mesh = do
       ]
 
 typeInfo = do
-  data_ "TypeInfo" $ do
-    constR_ "TypeInfo"
+  data_ "Range" $ do
+    constR_ "Range"
       [ "startLine"   #:: Int
       , "startColumn" #:: Int
       , "endLine"     #:: Int
       , "endColumn"   #:: Int
+      ]
+
+  data_ "TypeInfo" $ do
+    constR_ "TypeInfo"
+      [ "range"       #:: "Range"
       , "text"        #:: String
       ]
 
diff --git a/ddl/out/LambdaCube.IR.cpp b/ddl/out/LambdaCube.IR.cpp
index 67e5f0d..dfe47f8 100644
--- a/ddl/out/LambdaCube.IR.cpp
+++ b/ddl/out/LambdaCube.IR.cpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:56.948155000000Z
+// 2016-02-26T11:29:11.442441000000Z
 
 #include "LambdaCube.IR.hpp"
 template<> json toJSON<std::shared_ptr<ArrayValue>>(std::shared_ptr<ArrayValue> &v) {
diff --git a/ddl/out/LambdaCube.IR.hpp b/ddl/out/LambdaCube.IR.hpp
index fa8f583..6e10c94 100644
--- a/ddl/out/LambdaCube.IR.hpp
+++ b/ddl/out/LambdaCube.IR.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:56.948155000000Z
+// 2016-02-26T11:29:11.442441000000Z
 
 #ifndef HEADER_LambdaCube.IR_H
 #define HEADER_LambdaCube.IR_H
diff --git a/ddl/out/LambdaCube.IR.hs b/ddl/out/LambdaCube.IR.hs
index b1ab3ce..0bed2ec 100644
--- a/ddl/out/LambdaCube.IR.hs
+++ b/ddl/out/LambdaCube.IR.hs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:56.948155000000Z
+-- 2016-02-26T11:29:11.442441000000Z
 
 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 module LambdaCube.IR where
diff --git a/ddl/out/LambdaCube.IR.purs b/ddl/out/LambdaCube.IR.purs
index f21a121..ac7e585 100644
--- a/ddl/out/LambdaCube.IR.purs
+++ b/ddl/out/LambdaCube.IR.purs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:56.948155000000Z
+-- 2016-02-26T11:29:11.442441000000Z
 
 module LambdaCube.IR where
 import Prelude
diff --git a/ddl/out/LambdaCube.IR.swift b/ddl/out/LambdaCube.IR.swift
index 2b55d76..6aa412d 100644
--- a/ddl/out/LambdaCube.IR.swift
+++ b/ddl/out/LambdaCube.IR.swift
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:56.948155000000Z
+// 2016-02-26T11:29:11.442441000000Z
 
 typealias StreamName = Int
 
diff --git a/ddl/out/LambdaCube.IR2.hpp b/ddl/out/LambdaCube.IR2.hpp
index cad7c73..6564ba1 100644
--- a/ddl/out/LambdaCube.IR2.hpp
+++ b/ddl/out/LambdaCube.IR2.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:56.948155000000Z
+// 2016-02-26T11:29:11.442441000000Z
 
 #ifndef HEADER_LambdaCube.IR_H
 #define HEADER_LambdaCube.IR_H
diff --git a/ddl/out/LambdaCube.Mesh.cpp b/ddl/out/LambdaCube.Mesh.cpp
index a2e34cb..25ea594 100644
--- a/ddl/out/LambdaCube.Mesh.cpp
+++ b/ddl/out/LambdaCube.Mesh.cpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.342809000000Z
+// 2016-02-26T11:29:11.794796000000Z
 
 #include "LambdaCube.Mesh.hpp"
 template<> json toJSON<std::shared_ptr<MeshAttribute>>(std::shared_ptr<MeshAttribute> &v) {
diff --git a/ddl/out/LambdaCube.Mesh.hpp b/ddl/out/LambdaCube.Mesh.hpp
index 383ccea..9f84d29 100644
--- a/ddl/out/LambdaCube.Mesh.hpp
+++ b/ddl/out/LambdaCube.Mesh.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.342809000000Z
+// 2016-02-26T11:29:11.794796000000Z
 
 #ifndef HEADER_LambdaCube.Mesh_H
 #define HEADER_LambdaCube.Mesh_H
diff --git a/ddl/out/LambdaCube.Mesh.hs b/ddl/out/LambdaCube.Mesh.hs
index 340570e..0a25a4d 100644
--- a/ddl/out/LambdaCube.Mesh.hs
+++ b/ddl/out/LambdaCube.Mesh.hs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.342809000000Z
+-- 2016-02-26T11:29:11.794796000000Z
 
 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 module LambdaCube.Mesh where
diff --git a/ddl/out/LambdaCube.Mesh.purs b/ddl/out/LambdaCube.Mesh.purs
index 517d76b..c80739d 100644
--- a/ddl/out/LambdaCube.Mesh.purs
+++ b/ddl/out/LambdaCube.Mesh.purs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.342809000000Z
+-- 2016-02-26T11:29:11.794796000000Z
 
 module LambdaCube.Mesh where
 import Prelude
diff --git a/ddl/out/LambdaCube.Mesh.swift b/ddl/out/LambdaCube.Mesh.swift
index d469011..92b35b1 100644
--- a/ddl/out/LambdaCube.Mesh.swift
+++ b/ddl/out/LambdaCube.Mesh.swift
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.342809000000Z
+// 2016-02-26T11:29:11.794796000000Z
 
 enum MeshAttribute {
   case A_Float(Array<Float>)
diff --git a/ddl/out/LambdaCube.Mesh2.hpp b/ddl/out/LambdaCube.Mesh2.hpp
index 855fafa..960b61a 100644
--- a/ddl/out/LambdaCube.Mesh2.hpp
+++ b/ddl/out/LambdaCube.Mesh2.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.342809000000Z
+// 2016-02-26T11:29:11.794796000000Z
 
 #ifndef HEADER_LambdaCube.Mesh_H
 #define HEADER_LambdaCube.Mesh_H
diff --git a/ddl/out/LambdaCube.PipelineSchema.cpp b/ddl/out/LambdaCube.PipelineSchema.cpp
index 9161ceb..1d4b81a 100644
--- a/ddl/out/LambdaCube.PipelineSchema.cpp
+++ b/ddl/out/LambdaCube.PipelineSchema.cpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.323154000000Z
+// 2016-02-26T11:29:11.775644000000Z
 
 #include "LambdaCube.PipelineSchema.hpp"
 template<> json toJSON<std::shared_ptr<StreamType>>(std::shared_ptr<StreamType> &v) {
diff --git a/ddl/out/LambdaCube.PipelineSchema.hpp b/ddl/out/LambdaCube.PipelineSchema.hpp
index 4ed14d4..16a0f8d 100644
--- a/ddl/out/LambdaCube.PipelineSchema.hpp
+++ b/ddl/out/LambdaCube.PipelineSchema.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.323154000000Z
+// 2016-02-26T11:29:11.775644000000Z
 
 #ifndef HEADER_LambdaCube.PipelineSchema_H
 #define HEADER_LambdaCube.PipelineSchema_H
diff --git a/ddl/out/LambdaCube.PipelineSchema.hs b/ddl/out/LambdaCube.PipelineSchema.hs
index 5f6822b..55ae6f8 100644
--- a/ddl/out/LambdaCube.PipelineSchema.hs
+++ b/ddl/out/LambdaCube.PipelineSchema.hs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.323154000000Z
+-- 2016-02-26T11:29:11.775644000000Z
 
 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 module LambdaCube.PipelineSchema where
diff --git a/ddl/out/LambdaCube.PipelineSchema.purs b/ddl/out/LambdaCube.PipelineSchema.purs
index 258744a..eb467b2 100644
--- a/ddl/out/LambdaCube.PipelineSchema.purs
+++ b/ddl/out/LambdaCube.PipelineSchema.purs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.323154000000Z
+-- 2016-02-26T11:29:11.775644000000Z
 
 module LambdaCube.PipelineSchema where
 import Prelude
diff --git a/ddl/out/LambdaCube.PipelineSchema.swift b/ddl/out/LambdaCube.PipelineSchema.swift
index 6019917..93ed8ef 100644
--- a/ddl/out/LambdaCube.PipelineSchema.swift
+++ b/ddl/out/LambdaCube.PipelineSchema.swift
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.323154000000Z
+// 2016-02-26T11:29:11.775644000000Z
 
 enum StreamType {
   case Attribute_Word
diff --git a/ddl/out/LambdaCube.PipelineSchema2.hpp b/ddl/out/LambdaCube.PipelineSchema2.hpp
index fbf04ff..585da42 100644
--- a/ddl/out/LambdaCube.PipelineSchema2.hpp
+++ b/ddl/out/LambdaCube.PipelineSchema2.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.323154000000Z
+// 2016-02-26T11:29:11.775644000000Z
 
 #ifndef HEADER_LambdaCube.PipelineSchema_H
 #define HEADER_LambdaCube.PipelineSchema_H
diff --git a/ddl/out/LambdaCube.TypeInfo.cpp b/ddl/out/LambdaCube.TypeInfo.cpp
index 643afda..a965e4f 100644
--- a/ddl/out/LambdaCube.TypeInfo.cpp
+++ b/ddl/out/LambdaCube.TypeInfo.cpp
@@ -1,18 +1,50 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.376331000000Z
+// 2016-02-26T11:29:11.823283000000Z
 
 #include "LambdaCube.TypeInfo.hpp"
-template<> json toJSON<std::shared_ptr<TypeInfo>>(std::shared_ptr<TypeInfo> &v) {
+template<> json toJSON<std::shared_ptr<Range>>(std::shared_ptr<Range> &v) {
   json obj({});
   switch (v->tag) { 
-    case ::TypeInfo::tag::TypeInfo:
-      obj["tag"] = "TypeInfo";
+    case ::Range::tag::Range:
+      obj["tag"] = "Range";
       {
-        std::shared_ptr<data::TypeInfo> tv = std::static_pointer_cast<data::TypeInfo>(v);
+        std::shared_ptr<data::Range> tv = std::static_pointer_cast<data::Range>(v);
         obj["startLine"] = toJSON(tv->startLine);
         obj["startColumn"] = toJSON(tv->startColumn);
         obj["endLine"] = toJSON(tv->endLine);
         obj["endColumn"] = toJSON(tv->endColumn);
+      }
+      break;
+  }
+  return obj;
+}
+
+template<> std::shared_ptr<Range> fromJSON<std::shared_ptr<Range>>(W<std::shared_ptr<Range>> v, json &obj) {
+  enum ::Range::tag tagType;
+  std::string tag = obj["tag"];
+  if (tag == "Range") {
+    tagType = ::Range::tag::Range;
+    std::shared_ptr<data::Range> tv(new data::Range());
+    tv->startLine = fromJSON(W<Int>(), obj["startLine"]);
+    tv->startColumn = fromJSON(W<Int>(), obj["startColumn"]);
+    tv->endLine = fromJSON(W<Int>(), obj["endLine"]);
+    tv->endColumn = fromJSON(W<Int>(), obj["endColumn"]);
+    return tv;
+  }
+  else throw "unknown constructor: " + tag;
+  std::shared_ptr<::Range> o(new ::Range());
+  o->tag = tagType;
+  return o;
+}
+
+template<> json toJSON<std::shared_ptr<TypeInfo>>(std::shared_ptr<TypeInfo> &v) {
+  json obj({});
+  switch (v->tag) { 
+    case ::TypeInfo::tag::TypeInfo:
+      obj["tag"] = "TypeInfo";
+      {
+        std::shared_ptr<data::TypeInfo> tv = std::static_pointer_cast<data::TypeInfo>(v);
+        obj["range"] = toJSON(tv->range);
         obj["text"] = toJSON(tv->text);
       }
       break;
@@ -26,10 +58,7 @@ template<> std::shared_ptr<TypeInfo> fromJSON<std::shared_ptr<TypeInfo>>(W<std::
   if (tag == "TypeInfo") {
     tagType = ::TypeInfo::tag::TypeInfo;
     std::shared_ptr<data::TypeInfo> tv(new data::TypeInfo());
-    tv->startLine = fromJSON(W<Int>(), obj["startLine"]);
-    tv->startColumn = fromJSON(W<Int>(), obj["startColumn"]);
-    tv->endLine = fromJSON(W<Int>(), obj["endLine"]);
-    tv->endColumn = fromJSON(W<Int>(), obj["endColumn"]);
+    tv->range = fromJSON(W<std::shared_ptr<::Range>>(), obj["range"]);
     tv->text = fromJSON(W<String>(), obj["text"]);
     return tv;
   }
diff --git a/ddl/out/LambdaCube.TypeInfo.hpp b/ddl/out/LambdaCube.TypeInfo.hpp
index dd6b023..993388d 100644
--- a/ddl/out/LambdaCube.TypeInfo.hpp
+++ b/ddl/out/LambdaCube.TypeInfo.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.376331000000Z
+// 2016-02-26T11:29:11.823283000000Z
 
 #ifndef HEADER_LambdaCube.TypeInfo_H
 #define HEADER_LambdaCube.TypeInfo_H
@@ -8,19 +8,32 @@
 
 #include "LambdaCube.IR.hpp"
 
-class TypeInfo {
+class Range {
   public:
     enum class tag { 
-      TypeInfo
+      Range
     } tag;
 };
 namespace data { 
-  class TypeInfo : public ::TypeInfo {
+  class Range : public ::Range {
     public:
       Int startLine;
       Int startColumn;
       Int endLine;
       Int endColumn;
+      Range() { tag = tag::Range; }
+  };
+}
+class TypeInfo {
+  public:
+    enum class tag { 
+      TypeInfo
+    } tag;
+};
+namespace data { 
+  class TypeInfo : public ::TypeInfo {
+    public:
+      std::shared_ptr<::Range> range;
       String text;
       TypeInfo() { tag = tag::TypeInfo; }
   };
diff --git a/ddl/out/LambdaCube.TypeInfo.hs b/ddl/out/LambdaCube.TypeInfo.hs
index f23bd83..01bf5a6 100644
--- a/ddl/out/LambdaCube.TypeInfo.hs
+++ b/ddl/out/LambdaCube.TypeInfo.hs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.376331000000Z
+-- 2016-02-26T11:29:11.823283000000Z
 
 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 module LambdaCube.TypeInfo where
@@ -17,12 +17,19 @@ import Control.Monad
 
 import LambdaCube.IR
 
-data TypeInfo
-  = TypeInfo
+data Range
+  = Range
   { startLine :: Int
   , startColumn :: Int
   , endLine :: Int
   , endColumn :: Int
+  }
+
+  deriving (Show, Eq, Ord)
+
+data TypeInfo
+  = TypeInfo
+  { range :: Range
   , text :: String
   }
 
@@ -34,32 +41,50 @@ data CompileResult
   deriving (Show, Eq, Ord)
 
 
-instance ToJSON TypeInfo where
+instance ToJSON Range where
   toJSON v = case v of
-    TypeInfo{..} -> object
-      [ "tag" .= ("TypeInfo" :: Text)
+    Range{..} -> object
+      [ "tag" .= ("Range" :: Text)
       , "startLine" .= startLine
       , "startColumn" .= startColumn
       , "endLine" .= endLine
       , "endColumn" .= endColumn
-      , "text" .= text
       ]
 
-instance FromJSON TypeInfo where
+instance FromJSON Range where
   parseJSON (Object obj) = do
     tag <- obj .: "tag"
     case tag :: Text of
-      "TypeInfo" -> do
+      "Range" -> do
         startLine <- obj .: "startLine"
         startColumn <- obj .: "startColumn"
         endLine <- obj .: "endLine"
         endColumn <- obj .: "endColumn"
-        text <- obj .: "text"
-        pure $ TypeInfo
+        pure $ Range
           { startLine = startLine
           , startColumn = startColumn
           , endLine = endLine
           , endColumn = endColumn
+          } 
+  parseJSON _ = mzero
+
+instance ToJSON TypeInfo where
+  toJSON v = case v of
+    TypeInfo{..} -> object
+      [ "tag" .= ("TypeInfo" :: Text)
+      , "range" .= range
+      , "text" .= text
+      ]
+
+instance FromJSON TypeInfo where
+  parseJSON (Object obj) = do
+    tag <- obj .: "tag"
+    case tag :: Text of
+      "TypeInfo" -> do
+        range <- obj .: "range"
+        text <- obj .: "text"
+        pure $ TypeInfo
+          { range = range
           , text = text
           } 
   parseJSON _ = mzero
diff --git a/ddl/out/LambdaCube.TypeInfo.purs b/ddl/out/LambdaCube.TypeInfo.purs
index 3252a7f..8641df1 100644
--- a/ddl/out/LambdaCube.TypeInfo.purs
+++ b/ddl/out/LambdaCube.TypeInfo.purs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.376331000000Z
+-- 2016-02-26T11:29:11.823283000000Z
 
 module LambdaCube.TypeInfo where
 import Prelude
@@ -18,12 +18,18 @@ import Data.Argonaut.Decode (DecodeJson, decodeJson)
 
 import LambdaCube.IR
 
-data TypeInfo
-  = TypeInfo
+data Range
+  = Range
   { startLine :: Int
   , startColumn :: Int
   , endLine :: Int
   , endColumn :: Int
+  }
+
+
+data TypeInfo
+  = TypeInfo
+  { range :: Range
   , text :: String
   }
 
@@ -34,33 +40,51 @@ data CompileResult
 
 
 
-instance encodeJsonTypeInfo :: EncodeJson TypeInfo where
+instance encodeJsonRange :: EncodeJson Range where
   encodeJson v = case v of
-    TypeInfo r ->
-      "tag" := "TypeInfo" ~>
+    Range r ->
+      "tag" := "Range" ~>
       "startLine" := r.startLine ~>
       "startColumn" := r.startColumn ~>
       "endLine" := r.endLine ~>
       "endColumn" := r.endColumn ~>
-      "text" := r.text ~>
       jsonEmptyObject
 
-instance decodeJsonTypeInfo :: DecodeJson TypeInfo where
+instance decodeJsonRange :: DecodeJson Range where
   decodeJson json = do
     obj <- decodeJson json
     tag <- obj .? "tag"
     case tag of
-      "TypeInfo" -> do
+      "Range" -> do
         startLine <- obj .? "startLine"
         startColumn <- obj .? "startColumn"
         endLine <- obj .? "endLine"
         endColumn <- obj .? "endColumn"
-        text <- obj .? "text"
-        pure $ TypeInfo
+        pure $ Range
           { startLine:startLine
           , startColumn:startColumn
           , endLine:endLine
           , endColumn:endColumn
+          } 
+
+instance encodeJsonTypeInfo :: EncodeJson TypeInfo where
+  encodeJson v = case v of
+    TypeInfo r ->
+      "tag" := "TypeInfo" ~>
+      "range" := r.range ~>
+      "text" := r.text ~>
+      jsonEmptyObject
+
+instance decodeJsonTypeInfo :: DecodeJson TypeInfo where
+  decodeJson json = do
+    obj <- decodeJson json
+    tag <- obj .? "tag"
+    case tag of
+      "TypeInfo" -> do
+        range <- obj .? "range"
+        text <- obj .? "text"
+        pure $ TypeInfo
+          { range:range
           , text:text
           } 
 
diff --git a/ddl/out/LambdaCube.TypeInfo.swift b/ddl/out/LambdaCube.TypeInfo.swift
index 2e2fb0f..504c232 100644
--- a/ddl/out/LambdaCube.TypeInfo.swift
+++ b/ddl/out/LambdaCube.TypeInfo.swift
@@ -1,13 +1,20 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.376331000000Z
+// 2016-02-26T11:29:11.823283000000Z
 
-enum TypeInfo {
-  case TypeInfo(TypeInfo_Data)
-    struct TypeInfo_Data {
+enum Range {
+  case Range(Range_Data)
+    struct Range_Data {
       var startLine : Int
       var startColumn : Int
       var endLine : Int
       var endColumn : Int
+    }
+}
+
+enum TypeInfo {
+  case TypeInfo(TypeInfo_Data)
+    struct TypeInfo_Data {
+      var range : Range
       var text : String
     }
 }
@@ -71,15 +78,25 @@ extension Maybe {
 
 
 
-extension TypeInfo {
+extension Range {
   var toJSON : [String: AnyObject] {
     switch self {
-      case .TypeInfo(let v):
-        return [ "tag" : "TypeInfo"
+      case .Range(let v):
+        return [ "tag" : "Range"
                , "startLine" : v.startLine.toJSON
                , "startColumn" : v.startColumn.toJSON
                , "endLine" : v.endLine.toJSON
                , "endColumn" : v.endColumn.toJSON
+               ]
+    }
+  }
+}
+extension TypeInfo {
+  var toJSON : [String: AnyObject] {
+    switch self {
+      case .TypeInfo(let v):
+        return [ "tag" : "TypeInfo"
+               , "range" : v.range.toJSON
                , "text" : v.text.toJSON
                ]
     }
@@ -113,6 +130,7 @@ enum Type {
   case List(Type)
   case Maybe(Type)
   case Map(Type,Type)
+  case Range
   case TypeInfo
   case CompileResult
 }
diff --git a/ddl/out/LambdaCube.TypeInfo2.hpp b/ddl/out/LambdaCube.TypeInfo2.hpp
index cffe5ea..b5c16d7 100644
--- a/ddl/out/LambdaCube.TypeInfo2.hpp
+++ b/ddl/out/LambdaCube.TypeInfo2.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.376331000000Z
+// 2016-02-26T11:29:11.823283000000Z
 
 #ifndef HEADER_LambdaCube.TypeInfo_H
 #define HEADER_LambdaCube.TypeInfo_H
@@ -9,12 +9,25 @@
 #include "LambdaCube.IR.hpp"
 
 namespace data { 
-  class TypeInfo {
+  class Range {
   public: 
     Int startLine;
     Int startColumn;
     Int endLine;
     Int endColumn;
+  };
+}
+class Range {
+public:
+  enum class tag { 
+    Range
+  } tag;
+  std::shared_ptr<data::Range> Range;
+};
+namespace data { 
+  class TypeInfo {
+  public: 
+    std::shared_ptr<::Range> range;
     String text;
   };
 }
diff --git a/ddl/out/TestData.cpp b/ddl/out/TestData.cpp
index 5eaf158..881c6ba 100644
--- a/ddl/out/TestData.cpp
+++ b/ddl/out/TestData.cpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.396138000000Z
+// 2016-02-26T11:29:11.839781000000Z
 
 #include "TestData.hpp"
 template<> json toJSON<std::shared_ptr<ClientInfo>>(std::shared_ptr<ClientInfo> &v) {
diff --git a/ddl/out/TestData.hpp b/ddl/out/TestData.hpp
index 8aa75cd..b49ee9c 100644
--- a/ddl/out/TestData.hpp
+++ b/ddl/out/TestData.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.396138000000Z
+// 2016-02-26T11:29:11.839781000000Z
 
 #ifndef HEADER_TestData_H
 #define HEADER_TestData_H
diff --git a/ddl/out/TestData.hs b/ddl/out/TestData.hs
index 6c17fc9..ec33f72 100644
--- a/ddl/out/TestData.hs
+++ b/ddl/out/TestData.hs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.396138000000Z
+-- 2016-02-26T11:29:11.839781000000Z
 
 {-# LANGUAGE OverloadedStrings, RecordWildCards #-}
 module TestData where
diff --git a/ddl/out/TestData.purs b/ddl/out/TestData.purs
index 2fa0812..02942ca 100644
--- a/ddl/out/TestData.purs
+++ b/ddl/out/TestData.purs
@@ -1,5 +1,5 @@
 -- generated file, do not modify!
--- 2016-02-26T10:42:57.396138000000Z
+-- 2016-02-26T11:29:11.839781000000Z
 
 module TestData where
 import Prelude
diff --git a/ddl/out/TestData.swift b/ddl/out/TestData.swift
index 875f73c..6a1a868 100644
--- a/ddl/out/TestData.swift
+++ b/ddl/out/TestData.swift
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.396138000000Z
+// 2016-02-26T11:29:11.839781000000Z
 
 enum ClientInfo {
   case ClientInfo(ClientInfo_Data)
diff --git a/ddl/out/TestData2.hpp b/ddl/out/TestData2.hpp
index 0fa5e60..0ec32f2 100644
--- a/ddl/out/TestData2.hpp
+++ b/ddl/out/TestData2.hpp
@@ -1,5 +1,5 @@
 // generated file, do not modify!
-// 2016-02-26T10:42:57.396138000000Z
+// 2016-02-26T11:29:11.839781000000Z
 
 #ifndef HEADER_TestData_H
 #define HEADER_TestData_H