Commits

kevinclancy  committed 155a8ca

fixed an error where type accumulations on fields of open records were not being handled properly

  • Participants
  • Parent commits 2ecc8b1

Comments (0)

Files changed (12)

File ClassicModuleCreator/ClassicModuleCreator.csproj

     <AppDesignerFolder>Properties</AppDesignerFolder>
     <RootNamespace>ClassicModuleCreator</RootNamespace>
     <AssemblyName>ClassicModuleCreator</AssemblyName>
-    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
     <FileAlignment>512</FileAlignment>
     <TargetFrameworkProfile />
   </PropertyGroup>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
     <DefineConstants>TRACE</DefineConstants>
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <Prefer32Bit>false</Prefer32Bit>
   </PropertyGroup>
   <ItemGroup>
     <Reference Include="System" />

File ClassicTypeCollector/Main.fs

 
 exception GlobalStyleModuleDefinition of Range
 
-let rec getName (currentFile : string) (ast : TypedStatement) =
-    match ast with
-    | LocalAssign(
-        _,
-        [NameExpr(name,rng)],
-        [Constructor([],_)],
-        _
-      ) ->
-        Some (name,rng)
-    | Assign(
-        _,
-        [NameExpr(name,rng)],
-        [Constructor([],_)],
-        _
-      ) ->
-        raise( GlobalStyleModuleDefinition(rng) )
-    | Sequence(s0,s1,_) ->
-        let n0 = getName currentFile s0
-        let n1 = getName currentFile s1
-
-        match (n0,n1) with
-        | ( Some (name0,range0), Some (name1,range1) ) ->
-            addError
-                currentFile 
-                "multiple class definitions in file"
-                range1
-            addError
-                currentFile
-                "multiple class definitions in file"
-                range0
-            None
-          | ( Some x , _ ) ->
-            Some x
-          | ( _ , Some x ) ->
-            Some x
-          | _ ->
-            None 
-    | _ ->
-       None                    
-
-type FieldMap = Map<string, Field>
-type MethodMap = Map<string, Method>
-
 let rec returnsName (name : string) (ast : TypedStatement) =
     match ast with
     | Sequence(s0,DoNothing(_),_) ->
     | _ ->
         false
 
+let rec getName (currentFile : string) (ast : TypedStatement) =
+    match ast with
+    | Sequence(s0,s1,_) ->
+        match s0 with
+        | LocalAssign(
+            _,
+            [NameExpr(name,rng)],
+            [Constructor([],_)],
+            _
+          ) when returnsName name s1 ->
+            Some (name,rng)
+        | Assign(
+            _,
+            [NameExpr(name,rng)],
+            [Constructor([],_)],
+            _
+          ) when returnsName name s1 ->
+            raise( GlobalStyleModuleDefinition(rng) )
+        | _ ->
+            getName currentFile s1
+    | _ ->
+        None                    
+
+type FieldMap = Map<string, Field>
+type MethodMap = Map<string, Method>
+
+
 let typeGraphBuilder (modPath : string) (fileName : string) (ast : TypedStatement) =
     try
         match getName fileName ast with

File LoveStudio/LoveAPI.xml

             <parameter>
               <name>allowed</name>
               <description>True if the body is allowed to sleep or false if not.</description>
-              <type variant="number"></type>
+              <type variant="boolean"></type>
             </parameter>
           </type>
         </method>
             <return>
               <name>canvas</name>
               <description>The Canvas set by setCanvas. Returns nil if drawing to the real screen.</description>
-              <type variant="unknown"></type>
+              <type variant="usertype">
+                <name>Canvas</name>
+              </type>
             </return>
           </type>
         </field>

File LoveStudio/LuaAnalyzer.xml

 <members>
 <member name="T:Annotations.Annotation">
 <summary>
- AnnotationGroup(description,paramAnnotations, retAnnotations, varAnnotations) -
+ AnnotationGroup(description,paramAnnotations, retAnnotations, fieldAnnotation) -
  The description of the item being annotated followed by a map from formal
  names to annotations, followed by an ordered list of annotations for 
  return values
 </summary>
 </member>
-<member name="T:Annotations.VarAnnotation">
+<member name="T:Annotations.FieldAnnotation">
 <summary>
- RetAnnotation(type,description)
- type - typename for the expected return value
- description - description of the expected return value
+ FieldAnnotation(type,description,isVariable)
+ type - type ascribed to the field (or None if no type is ascribed)
+ description - description of the variable
 </summary>
 </member>
 <member name="T:Annotations.RetAnnotation">
  us to change the TokenInfo type.
 </summary>
 </member>
+<member name="T:Annotations.AnnotationField.Const">
+<summary>
+ Const(type,description)
+ type - the name of the type of the constant
+ description - a decription of the constant
+</summary>
+</member>
 <member name="T:Annotations.AnnotationField.Var">
 <summary>
  Var(type,description)
 <member name="">
 
 </member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
-<member name="">
-
+<member name="M:Annotations.parseConstAnnotation">
+<summary>
+ Reads a const annotation &quot;const(typename) description&quot; from the input string,
+ returning a representation of the annotation which was read.
+
+ If the input string does not contain a properly formatted variable annotation, 
+ throws an exception.
+</summary>
+</member>
+<member name="M:Annotations.parseVarAnnotation">
+<summary>
+ Reads a variable annotation &quot;var(typename) description&quot; from the input string, 
+ returning a representation of the annotation which was read.
+
+ If the input string does not contain a properly formatted variable annotation, 
+ throws an exception.
+</summary>
+</member>
+<member name="M:Annotations.parseFieldAnnotation">
+<summary>
+ Parses a string of the form &quot;(typename) description&quot;
+ Returns a pairs of strings (typeName,description) each elements containing
+ the corresponding section of the input text.
+
+ Throws an AnnotationParsing exception if the input string does not
+ match the format &quot;(typename) description&quot;
+</summary>
+</member>
+<member name="M:Annotations.parseTypeName">
+<summary>
+ Reads a typename beginning at the current position of the input
+ iterator. Advances the input iterator past the typename. Returns
+ the read typename.
+</summary>
+</member>
+<member name="M:Annotations.isAlpha(System.Char)">
+<summary>
+ Returns ture iff x is an alphabet character OR an underscore
+</summary>
+</member>
+<member name="M:Annotations.eatWhitespace">
+<summary>
+ Advances the character iterator until it reaches a non-whitespace
+ character.
+</summary>
+</member>
+<member name="M:Annotations.isSpace(System.Char)">
+<summary>
+ returns true iff x is a whitespace character
+</summary>
+</member>
+<member name="P:Annotations.s">
+<summary>
+ The annotation string that we are lexing
+</summary>
 </member>
 <member name="P:Annotations.i">
 <summary>
 <member name="">
 
 </member>
+<member name="">
+
+</member>
 <member name="T:Annotations">
 <summary>
  Functions for extracting semantic annotations and documentation metadata
 <member name="">
 
 </member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
 <member name="T:LuaAnalyzer.Analyzer.CSRecordType">
 <summary>
  C# compatible forms for types
  The standard .NET generic list class. (A resizable array.)
 </summary>
 </member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
 <member name="M:LuaAnalyzer.Analyzer.init">
 <summary>
  Initialize all type collector plugins
 <member name="">
 
 </member>
+<member name="M:LuaAnalyzer.Analyzer.syncLibModules(System.String)">
+<summary>
+ Copies all library modules from the UserData directory to the project directory
+ Returns a list of all library modules
+</summary>
+</member>
+<member name="">
+
+</member>
 <member name="">
 
 </member>
 <member name="">
 
 </member>
+<member name="">
+
+</member>
 <member name="T:LuaAnalyzer.BasePlugin">
 
 </member>
+<member name="F:LuaAnalyzer.Context.Context.addGlobals">
+<summary>
+ True tells the typechecker that assigning variables which are not 
+ in the context should add them to the context.
+ (this is true when checking globals.lua, but should be false most of the time)
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Context.Context.isLeftExpr">
+<summary>
+ True iff we are checking an expression on the left-hand side of an assignment
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Context.Context.trackErrors">
+<summary>
+ True iff we should generate are messages whenever errors are encountered
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Context.Context.queryPos">
+<summary>
+ The position in the source file of the term that the user has 
+ requested information about.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Context.Context.tenv">
+<summary>
+ Type Environment -- Contains all known information about types
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Context.Context.venv">
+<summary>
+ value environment -- maps variable names to variable types. 
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="P:LuaAnalyzer.Context.Context.UndoAllAccumulations">
+<summary>
+ Undoes all types in the type environment (in effect,
+ reducing all accumulated types to their permanent types).
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.TrackErrors">
+<summary>
+ A context identical to this one, except that it tracks errors
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.IsNotLeftExpr">
+<summary>
+ A context identical to this one, except intended for non-left expressions
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.IsLeftExpr">
+<summary>
+ A context identical to this one, except intended for left expressions
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.DontTrackErrors">
+<summary>
+ A context identical to this one, except that it does not track errors
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.DontAddGlobals">
+<summary>
+ A context identical to this one, but which tells the typechecker
+ to generate errors upon encountering the assignment of names
+ which are not currently in the value environment.
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.Context.AddGlobals">
+<summary>
+ A context identical to this one, but which tells the typechecker to
+ add new global assignments to the value environment rather than
+ generating &quot;identifier not in context&quot; errors
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="M:LuaAnalyzer.Context.Context.AddValue(System.String,LuaAnalyzer.Type.Field)">
+<summary>
+ Adds a value to the value environment with the 
+ specified name and field.
+</summary>
+</member>
+<member name="T:LuaAnalyzer.Context.Context">
+<summary>
+ A structure which serves as an argument to typechecking functions. It stores
+ all information necessary for typechecking (but external to) the term being typechecked.
+
+ Context structures are modified in a purely functional manner when passed to
+ recursive invocations of the typechecker on the children of the syntax node being
+ checked. 
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="M:LuaAnalyzer.Context.setBaseContext(LuaAnalyzer.Context.Context)">
+<summary>
+ Sets the base context, which is the portion of the context consisting
+ of values defined by various external APIs and standard libraries, and
+ which is not affected by the projected at all.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Context.getBaseContext">
+<summary>
+ Gets the base context, which is the portion of the context consisting
+ of values defined by various external APIs and standard libraries, and
+ which is not affected by the projected at all.
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Context.baseContext">
+<summary>
+ Contains all globals loaded from API definition XML files.
+</summary>
+</member>
+<member name="T:LuaAnalyzer.Context">
+
+</member>
 <member name="">
 
 </member>
 <member name="T:LuaAnalyzer.HandParser">
 
 </member>
+<member name="M:LuaAnalyzer.Plugins.ITypeCollectorPlugin.Init">
+<summary>
+ Activates the type collector
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Plugins.ITypeCollectorPlugin.GetLibPaths">
+<summary>
+ Returns a sequence of all relative paths of lua library
+ files to copy from the plugin directory to the project 
+ directory
+</summary>
+</member>
 <member name="">
 
 </member>
 <member name="">
 
 </member>
+<member name="T:LuaAnalyzer.Plugins">
+
+</member>
 <member name="">
 
 </member>
 <member name="">
 
 </member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.ProjectChecker">
+
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.TopSortColor.BLACK">
+<summary>
+ black nodes have already been processed
+</summary>
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.TopSortColor.GRAY">
+<summary>
+ gray nodes are currently being processed
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="F:LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState.collectedFrom">
+<summary>
+ maps module names to the collectors which collected them
+</summary>
+</member>
+<member name="F:LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState.allTypeNames">
+<summary>
+ all type names collected so far
+</summary>
+</member>
+<member name="F:LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState.tenv">
+<summary>
+ the type environment containing the graph we are building
+</summary>
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState">
+<summary>
+ The data we need to track during the construction of the
+ subtype graph.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.SubtypeGraphBuilder.buildSubtypeGraph(System.Collections.Generic.IEnumerable{System.Tuple{System.String,System.String,LuaAnalyzer.TypedSyntax.TypedStatement,System.Int64}},LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpSet{System.String})">
+<summary>
+ modules - a sequence of (filename,modulename,ast,timestamp) quadruples
+ for all modules in the project
+
+ tyenv0 - The type environment after having read in all API data from XML files
+
+ typeNames0 - The names of all types read from API definitions in XML files
+
+ Starting with the subtypegraph in tenv0, accumulates a subject graph computed
+ from the lua project whose modules are all included in the modules sequence.
+ Returns the resulting type environment, along with a map which record which
+ modules were collected by which type collectors.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.SubtypeGraphBuilder.checkGraphErrors(LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState)">
+<summary>
+ Raise an exception if there are any broken edges or cycles in the subtype graph.
+ If some type collector requires ancestor graphs to be trees, we raise an exception
+ if diamonds are found in the subtype graph.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.SubtypeGraphBuilder.checkStructureErrors(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.TypeCollector.TypeCollector},System.String)">
+<summary>
+ If the root&apos;s type collector requires a tree ancestor graph, we raise an 
+ exception if there are cycles or diamonds in its the ancestor graph.
+
+ Otherwise, we raise an exception if there are cycles in its ancestor graph.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.SubtypeGraphBuilder.foldModule(LuaAnalyzer.TypeCollector.TypeCollector,LuaAnalyzer.SubtypeGraphBuilder.TypeGraphBuilderState,System.String,System.String,LuaAnalyzer.TypedSyntax.TypedStatement,System.Int64)">
+<summary>
+ If the supplied module is collected by collector, accumulate its type graph data into acc
+</summary>
+</member>
+<member name="M:LuaAnalyzer.SubtypeGraphBuilder.checkBrokenEdges(LuaAnalyzer.Type.TypeEnvironment)">
+<summary>
+ If any edge leads to an edge which is not an instance type (or doesn&apos;t exist),
+ raise an exception
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.CollectorError">
+<summary>
+ Used for errors in the implementations of type collectors.
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.CollectionConflict">
+<summary>
+ CollectionConflict(collectorName1,collectorName2,moduleName,fileName,range)
+
+ thrown when two different collectors both successfully collect
+ types from a module.
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.TypeGraphDiamondException">
+<summary>
+ TypeGraphDiamondException(source, dest, pathA, pathB,fileName,rng)
+
+ thrown when the type named source can reach the type named dest
+ via two different paths: pathA and pathB
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder.BrokenEdgeException">
+<summary>
+ BrokenEdgeException(child,parent,fileName,rng) 
+ Thrown when a class inherits from a class which was not collected
+</summary>
+</member>
+<member name="T:LuaAnalyzer.SubtypeGraphBuilder">
+
+</member>
+<member name="">
+
+</member>
+<member name="T:LuaAnalyzer.Syntax.ConstructorField.RecField">
+<summary>
+ RecField(annotation,key,value,rng)
+</summary>
+</member>
+<member name="T:LuaAnalyzer.Syntax.ConstructorField.ListField">
+<summary>
+ ListField(annotation,value,rng)
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
 <member name="T:LuaAnalyzer.Syntax.Expr.CallExpr">
 <summary>
 CallExpr(func,
 <member name="">
 
 </member>
-<member name="">
-
-</member>
-<member name="">
-
-</member>
-<member name="">
-
+<member name="M:LuaAnalyzer.Syntax.getExprRange(LuaAnalyzer.Syntax.Expr)">
+<summary>
+ Gets the range of character indices that an expression occupies
+ in a file.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Syntax.getStatementRange(LuaAnalyzer.Syntax.Statement)">
+<summary>
+ Gets the range of character indices that a statement occupies in
+ a file.
+</summary>
 </member>
 <member name="">
 
 <member name="">
 
 </member>
-<member name="">
-
-</member>
 <member name="T:LuaAnalyzer.Token">
 
 </member>
 </member>
 <member name="F:LuaAnalyzer.Type.MetamethodSet.Not">
 <summary>
- Unary &apos;not&apos; operator type, if defined
+ Unary &apos;not&apos; operator type, if defined; for certain built-in types only
 </summary>
 </member>
 <member name="F:LuaAnalyzer.Type.MetamethodSet.Or">
 <summary>
- Binary &apos;or&apos; operator type, if defined
+ Binary &apos;or&apos; operator type, if defined; for certain built-in types only
 </summary>
 </member>
 <member name="F:LuaAnalyzer.Type.MetamethodSet.And">
 <summary>
- Binary &apos;and&apos; operator type, if defined
+ Binary &apos;and&apos; operator type, if defined; for certain built-in types only
 </summary>
 </member>
 <member name="F:LuaAnalyzer.Type.MetamethodSet.Ge">
  Binary &apos;+&apos; operator type, if defined
 </summary>
 </member>
+<member name="P:LuaAnalyzer.Type.MetamethodSet.empty">
+<summary>
+ Default metamethod set, defining metamethods only for the == and ~=
+ operators, which can be applied to operands of any type.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Type.MetamethodSet.cover(LuaAnalyzer.Type.MetamethodSet,LuaAnalyzer.Type.MetamethodSet)">
+<summary>
+ Returns a metamethod set which is the result of covering a with b.
+
+ i.e. a metamethod set which uses all of the metamethods
+ of b which are defined. For those which does b does not define,
+ it uses a&apos;s metamethods if they exist. If neither set defines
+ an operator, the resulting set does not define that operator.
+</summary>
+</member>
 <member name="">
 
 </member>
  to instantiate an abstract class. 
 </summary>
 </member>
-<member name="T:LuaAnalyzer.Type.Type.DeducedTy">
+<member name="T:LuaAnalyzer.Type.Type.AccumulatedTy">
 <summary>
- permanent type/temporary type
+ AccumulatedTy(permTy,tempTy) tempTy must be a subtype of permTy
  can be assigned to any value belonging to the permanent type
  can be used as temporary type
- TODO: Closures could really screw up deduced types. Closures are rare,
- though. We could disable deduced types in blocks with closures.
+ These do not appear in annotations, but appear in intellisense as 
+ &quot;perm(temp)&quot;
 </summary>
 </member>
 <member name="T:LuaAnalyzer.Type.Type.UserDefinedTy">
 </member>
 <member name="T:LuaAnalyzer.Type.Type.FunctionTy">
 <summary>
- Function(desc,params,rets,method, isAbstract, deflocation) -
+ Function(desc,params,rets,method, deflocation) -
  desc - description of the function
  params - name/description/type triples for each formal parameter
  ret - description/type pairs for each return value
  which can be called.
 </summary>
 </member>
+<member name="T:LuaAnalyzer.Type.Type.NewFieldTy">
+<summary>
+ When an open record in a left expression gets indexed by a field it doesn&apos;t
+ have, the resulting type is NewField. NewField is a treated as a 
+ supertype of everything so that its variables can be assigned to anything.
+</summary>
+</member>
 <member name="T:LuaAnalyzer.Type.Type.RecordTy">
 <summary>
- Record(name,description,srcExpr,metamethods,fieldMap,methodMap)
+ Record(name,description,isStructural,openStatus,metamethods,fieldMap,methodMap,defLocation)
  fieldList and methodList map names to description/type/loc triples
  srcExpr maps  
 
- 
- 
  Classifies expressions which denote records. A record contains labeled
  fields and methods which can be indexed, as well as a set of operator
  overloads (i.e. metamethods). 
 </member>
 <member name="T:LuaAnalyzer.Type.Type.StringTy">
 <summary>
- StringTy classifies expressions which denote arrays of characters.
+ StringTy classifies expressions which denote immutable arrays of characters.
 </summary>
 </member>
 <member name="T:LuaAnalyzer.Type.Type.NumberTy">
 <member name="">
 
 </member>
+<member name="M:LuaAnalyzer.Type.Type.ToStringElaborate">
+<summary>
+ Provides an elaborate, multiline description of the type (or a short one-liner when sufficient) 
+ for use in calltips.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Type.Type.ToString">
+<summary>
+ A brief, one line description of the type.
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="M:LuaAnalyzer.Type.Type.MakeAccumulatedTy(LuaAnalyzer.Type.Type,LuaAnalyzer.Type.Type)">
+<summary>
+ Generate an accumulated type for when an field of type original 
+ has been determined to have type accumulated.
+</summary>
+</member>
+<member name="">
+
+</member>
 <member name="">
 
 </member>
  when, for example, it gets operated on, called, or parenthesized.
 </summary>
 </member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
 <member name="T:LuaAnalyzer.Type.Type">
 <summary>
  A family of optional types for classifying lua expressions and associating
  them with descriptions about the types of values they denote.
 </summary>
 </member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
+<member name="F:LuaAnalyzer.Type.Field.isConst">
+<summary>
+ Whether or not this identifier can be reassigned to expressions
+ determined to have type *ty*.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Field.loc">
+<summary>
+ The location (filename, char index) at which this identifier was 
+ delcared.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Field.ty">
+<summary>
+ A statically computed type of the values that the identifier
+ denotes. Since this is not a sound type system, runtime values
+ associated with this identifier may sometimes not actually belong
+ to this type; the goal is to design the type system to minimize
+ the frequency of theses scenarios without limiting the programmer.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Field.desc">
+<summary>
+ A description of the identifier&apos;s purpose
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Type.Field.OfType(LuaAnalyzer.Type.Type)">
+<summary>
+ generate an empty field with the given type
+</summary>
+</member>
+<member name="T:LuaAnalyzer.Type.Field">
+<summary>
+ Many identifiers occurring in programs refer to runtime values. These
+ identifiers are associated the statically computed satellite data 
+ contained in Field.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Method.loc">
+<summary>
+ The location (filename, char index) at which this identifier was 
+ delcared.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Method.isAbstract">
+<summary>
+ Whether or not the method is abstract. 
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Method.ty">
+<summary>
+ They type of the method.
+ Must be a function type with at least one formal parameter,
+ the leading parameter being a non-typed self reference.
+</summary>
+</member>
+<member name="F:LuaAnalyzer.Type.Method.desc">
+<summary>
+ A description of the method&apos;s behavior
+</summary>
+</member>
 <member name="T:LuaAnalyzer.Type.Method">
 <summary>
- Description, type, isAbstract, definition location
+ Describes an operation which can be performed by an object.
 </summary>
 </member>
-<member name="">
-
-</member>
 <member name="F:LuaAnalyzer.Type.TypeEnvironment.edges">
 <summary>
  A nominal subtyping graph, includes both internal and external types
  referenced from annotations
 </summary>
 </member>
-<member name="">
-
+<member name="P:LuaAnalyzer.Type.TypeEnvironment.empty">
+<summary>
+ An empty type environment
+</summary>
+</member>
+<member name="P:LuaAnalyzer.Type.TypeEnvironment.TopSortedTypeNames">
+<summary>
+ A list of all typenames appearing in the nominal subtyping
+ graph, topologically sorted. what does it mean for a list to be 
+ topologically sorted? See the wikipedia page on it: *insert url here*.
+ Also, read CLRS; you&apos;ll learn a bunch of other cool algorithms in 
+ addition to the topological sort.
+</summary>
 </member>
 <member name="">
 
 <member name="">
 
 </member>
+<member name="">
+
+</member>
+<member name="">
+
+</member>
 <member name="M:LuaAnalyzer.Type.getBinOp(LuaAnalyzer.Type.MetamethodSet,LuaAnalyzer.Syntax.BinOp)">
 <summary>
  Given a metamethod set, returns the metamethod (if any) defined for
 <member name="">
 
 </member>
-<member name="">
-
+<member name="M:LuaAnalyzer.Type.|ArrayTy|_|(LuaAnalyzer.Type.Type)">
+<summary>
+ | ArrayTy(elemTy)
+ Matches any record type which has has an index metatmethod
+ defined whose key type is NumberTy and whose value type
+ is elemTy
+</summary>
 </member>
 <member name="M:LuaAnalyzer.Type.|CallableTy|_|(LuaAnalyzer.Type.Type)">
 <summary>
  deflocation - location of function definition
 </summary>
 </member>
-<member name="P:LuaAnalyzer.Type.EmptyMetamethodSet">
-<summary>
- Default metamethod set, defining metamethods only for the == and ~=
- operators, which can be applied to operands of any type.
-</summary>
-</member>
 <member name="">
 
 </member>
  Used for when someone tries to override a method using an incorrect 
  type signature.
 
- error message, rng
+ error message, fileName, rng
 </summary>
 </member>
 <member name="T:LuaAnalyzer.Type">
 <summary>
- Defines a family of opitional types which are used for classifying 
+ Defines a family of optional types which are used for classifying 
  lua expressions and propogating intellisense data.
 
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.detectMiscErrors">
+<member name="">
+
+</member>
+<member name="P:LuaAnalyzer.TypeChecker.refStubDefLoc">
+<summary>
+ This holds the definition location of some program term which was
+ queried by the user (i.e. the location component of a field or method)
+</summary>
+</member>
+<member name="P:LuaAnalyzer.TypeChecker.refStubTy">
+<summary>
+ Holds the type of some program term which was queried by the user
+</summary>
+</member>
+<member name="P:LuaAnalyzer.TypeChecker.refStubDesc">
+<summary>
+ This holds a comment description of some program term which was 
+ queried by the user (i.e. the description component of a field or method)
+</summary>
+</member>
+<member name="P:LuaAnalyzer.TypeChecker.refStubContext">
+<summary>
+ This holds a context intentionally extracted from a certain location in 
+ the program. For example, whenever the use makes an intellisense query,
+ we extract the context wherever the caret is at.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.|MethodDefInCtxt|(LuaAnalyzer.Context.Context,System.String,LuaAnalyzer.TypedSyntax.TypedStatement)">
+<summary>
+ |MethodDefInCtxt| tenv ctxt methodName stat
+ Searches for a definition for a method called methodName in stat,
+ yielding the body and context of the first such method encountered, if any.
+
+ This can be used, for example, for extracting a constructor in a class 
+ definition along with the context it appears in. These items can be used  
+ to for the internal type collection phase.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.typeCheckField(LuaAnalyzer.Context.Context,LuaAnalyzer.TypedSyntax.TypedConstructorField)">
+<summary>
+ typeCheckField ctxt field -
+ If ctxt.trackErrors is true:
+ Adds any typing errors to the error list which result from checking
+ field w.r.t. ctxt.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.typeCheckExpr(LuaAnalyzer.Context.Context,LuaAnalyzer.TypedSyntax.TypedExpr)">
+<summary>
+ typeCheckExpr ctxt expr -
+ If ctxt.trackErrors is true, adds any typing errors to the error list which 
+ result from checking stat w.r.t. ctxt.
+
+ Returns the computed type of the expression.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.typeCheckStat(LuaAnalyzer.Context.Context,LuaAnalyzer.TypedSyntax.TypedStatement)">
+<summary>
+ typeCheckStat ctxt stat trackErrors -
+ if ctxt.trackErrors is true:
+ Adds any typing errors to the error list which result from checking
+ stat w.r.t. ctxt.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.getAssigns(LuaAnalyzer.Context.Context,LuaAnalyzer.TypedSyntax.TypedStatement)">
+<summary>
+ (getAssigns ctxt stat) gets the types of all unbound assigns in stat
+ (considered w.r.t. ctxt).
+
+ For example, in psuedocode:
+ getAssigns tenv [(b,string)] &apos;local a = 3; a = 5; b = &quot;hello&quot;; c = 3&apos; would 
+ return [(c,number)].
+</summary>
+</member>
+<member name="M:LuaAnalyzer.TypeChecker.updateCtxt(LuaAnalyzer.Context.Context,LuaAnalyzer.TypedSyntax.TypedStatement)">
+<summary>
+ updateCtxt(tenv,ctxt,stat) 
+ Returns a context which is the argument ctxt with any modifications made
+ by stat (considered w.r.t. tenv and ctxt) added to it. local assignments 
+ add new variables to the context, assignments make refinements to existing 
+ ones, compound statements combine the effects of their substatements, etc.
+</summary>
+</member>
+<member name="T:LuaAnalyzer.TypeChecker">
+
+</member>
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.detectMiscErrors">
 <summary>
  Detects miscellaneous, class-system specific errors in the syntax tree
  params: Type environment, module path, file path, syntax tree
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.decorate">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.decorate">
 <summary>
  Given a string specifying a path and a syntax tree, 
  prepare for typechecking by giving types to parameters and possibly 
  adding ascriptions.
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.internalTypeBuilder">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.internalTypeBuilder">
 <summary>
  Takes a type environment, a global context, a module name, a file name, and a syntax tree
  for the file located at that path. Returns a list of all internal
  types defined by the module if any.
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.externalTypeBuilder">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.externalTypeBuilder">
 <summary>
  Takes a string specifying a module path, a string specifying a file name, and a syntax tree
  for the file located at that path. Returns a pair (ext,cons),
  cons is its constructor type.
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.typeGraphIsTree">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.typeGraphIsTree">
 <summary>
  If this type collector expects the type graph to be a tree, this should
  be set to true; this will cause errors whenever a viloation of the tree 
- property is detected. (Remember, edges point from subtype to supertype;
- it&apos;s a dependency graph.)
+ property is detected.
 
  Otherwise, the type graph is expected to be a DAG.
  In either case, errors will be produced if the graph contains 
  cycles.
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.typeGraphBuilder">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.typeGraphBuilder">
 <summary>
  Takes a string specifying a module path, a string specifying a file name, and a syntax tree
  for the file located at that path, and returns an external typename&apos;s range if any, 
  the external type to the types of any classes or traits it inherits from.
 </summary>
 </member>
-<member name="F:LuaAnalyzer.TypeChecker.TypeCollector.name">
+<member name="F:LuaAnalyzer.TypeCollector.TypeCollector.name">
 <summary>
  The name of the type collector. Used to report compatiblity errors
  among multiple type collecters.
 <member name="">
 
 </member>
+<member name="P:LuaAnalyzer.TypeCollector.typeCollectors">
+<summary>
+ All type collectors which were loaded from plugins
+</summary>
+</member>
+<member name="T:LuaAnalyzer.TypeCollector">
+
+</member>
 <member name="">
 
 </member>
-<member name="M:LuaAnalyzer.TypeChecker.typeCheckProject(System.Collections.Generic.IEnumerable{System.Tuple{System.String,System.String,System.String,System.Int64}})">
-<summary>
- typeCheckProject project - where project is the sequence of all 
- fileName,moduleName,fileContents triples in the project we wish to check.
- 
- Typechecks the specified project, returning a list of all errors encountered,
- an optional type environment containing the final result of type collection
- (or None if any type collection errors were encountered), and the context
- extracted at the position of a specially planted stub (a call to a function
- called lucbdnioua).
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.|MethodDefInCtxt|(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},System.String,LuaAnalyzer.TypedSyntax.TypedStatement)">
-<summary>
- |MethodDefInCtxt| tenv ctxt methodName stat
- Searches for a definition for a method called methodName in stat,
- yielding the body and context of the first such method encountered, if any.
-
- This can be used, for example, for extracting a constructor in a class 
- definition along with the context it appears in. These items can be used  
- to for the internal type collection phase.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.typeCheckField(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},LuaAnalyzer.TypedSyntax.TypedConstructorField,System.Boolean)">
-<summary>
- typeCheckField env ctxt field trackErrors -
- If trackErrors is true:
- Adds any typing errors to the error list which result from checking
- field w.r.t. env and ctxt.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.typeCheckExpr(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},LuaAnalyzer.TypedSyntax.TypedExpr,System.Boolean)">
-<summary>
- typeCheckExpr env ctxt expr trackErrors -
- If trackErrors is true, adds any typing errors to the error list which 
- result from checking stat w.r.t. env and ctxt.
-
- Returns the computed type of the expression.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.typeCheckStat(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},LuaAnalyzer.TypedSyntax.TypedStatement,System.Boolean)">
-<summary>
- typeCheckStat env ctxt stat trackErrors -
- if trackErrors is true:
- Adds any typing errors to the error list which result from checking
- stat w.r.t. env and ctxt.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.getAssigns(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},LuaAnalyzer.TypedSyntax.TypedStatement)">
-<summary>
- getAssigns(tenv,ctxt,stat) gets the types of all unbound assigns in stat
- (considered w.r.t. tenv and ctxt).
-
- For example, in psuedocode:
- getAssigns tenv [(b,string)] &apos;local a = 3; a = 5; b = &quot;hello&quot;; c = 3&apos; would 
- return [(c,number)].
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.updateCtxt(LuaAnalyzer.Type.TypeEnvironment,Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type},LuaAnalyzer.TypedSyntax.TypedStatement)">
-<summary>
- updateCtxt(tenv,ctxt,stat) 
- Returns a context which is the argument ctxt with any modifications made
- by stat (considered w.r.t. tenv and ctxt) added to it. local assignments 
- add new variables to the context, assignments make refinements to existing 
- ones, compound statements combine the effects of their substatements, etc.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.setBaseTypeEnvironment(LuaAnalyzer.Type.TypeEnvironment)">
-<summary>
- Sets the base type environment, which is the portion of the type environment 
- consisting of types defined by various external APIs and standard libraries, and
- which is not affected by the projected at all.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.getBaseTypeEnvironment">
-<summary>
- Gets the base type environment, which is the portion of the type environment 
- consisting of types defined by various external APIs and standard libraries, and
- which is not affected by the projected at all.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.setBaseContext(Microsoft.FSharp.Collections.FSharpMap{System.String,LuaAnalyzer.Type.Type})">
-<summary>
- Sets the base context, which is the portion of the context consisting
- of values defined by various external APIs and standard libraries, and
- which is not affected by the projected at all.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.getBaseContext">
-<summary>
- Gets the base context, which is the portion of the context consisting
- of values defined by various external APIs and standard libraries, and
- which is not affected by the projected at all.
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.getTypeCollectorByName(System.String)">
-<summary>
- Returns the type collector with the given name if any exist
- Otherwise, returns None
-</summary>
-</member>
-<member name="M:LuaAnalyzer.TypeChecker.addTypeCollector(LuaAnalyzer.TypeChecker.TypeCollector)">
-<summary>
- Adds a type collector the list of all active type collectors.
- Should be called by plugins in their initialization functions.
-</summary>
-</member>
 <member name="">
 
 </member>
-<member name="T:LuaAnalyzer.TypeChecker.CollectorError">
-<summary>
- Used for errors in the implementations of type collectors.
-</summary>
-</member>
-<member name="T:LuaAnalyzer.TypeChecker">
-
-</member>
 <member name="">
 
 </member>
 </member>
 <member name="T:LuaAnalyzer.TypedSyntax.TypedStatement.Assign">
 <summary>
- Assign(varTypeAscriptions=[a1,a2,...],varDescriptions=[d1,d2,...],
- lexprs=[l1,l2,...], rexprs=[r1,r2,...])
- occurs in source as &quot;--@var(a1) d1 @var(a2) d2 ... l1,l2,... = r1,r2...&quot;
+ Assign(annotation,lexprs=[l1,l2,...], rexprs=[r1,r2,...])) 
+ occurs in source as &quot;--annotiation \n l1,l2,... = r1,r2...&quot;
 </summary>
 </member>
 <member name="T:LuaAnalyzer.TypedSyntax.TypedStatement.LocalAssign">
 
 </summary>
 </member>
+<member name="T:LuaAnalyzer.Utils.LuaModule">
+<summary>
+ (fullPathName,moduleName,contents,lastModifiedTime)
+</summary>
+</member>
+<member name="">
+
+</member>
+<member name="M:LuaAnalyzer.Utils.sizeListTo``1(Microsoft.FSharp.Collections.FSharpList{``0},System.Int32,``0)">
+<summary>
+ Returns a list which is the result of modifying lst to have length targetLength.
+
+ If lst.Length is greater than targetLength, returns a list containing the
+ first targetLength elements of lst. 
+
+ If lst.Length is less than targetLength, returns a list which is equivalent
+ to lst with filler appended to it (targetLength-lst.Length) times.
+
+ Otherwise returns lst
+</summary>
+</member>
 <member name="M:LuaAnalyzer.Utils.popnBack``1(Microsoft.FSharp.Collections.FSharpList{``0},System.Int32)">
 <summary>
  Pop n elements from the back of the list
  Pads the given list with the given item until it reaches the target length
 </summary>
 </member>
-<member name="">
-
-</member>
-<member name="">
-
+<member name="M:LuaAnalyzer.Utils.coverListOpt``1(Microsoft.FSharp.Collections.FSharpList{``0},Microsoft.FSharp.Collections.FSharpList{Microsoft.FSharp.Core.FSharpOption{``0}})">
+<summary>
+ Let n = min(under.Length, over.Length)
+ Returns a list which is equal to under, except for its first n elements,
+ which are replaced with the corresponding elements of over, whenever such
+ elements are not None.
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Utils.coverList``1(Microsoft.FSharp.Collections.FSharpList{``0},Microsoft.FSharp.Collections.FSharpList{``0})">
+<summary>
+ Let n = min(under.Length, over.Length)
+ Returns a list which is equal to under, except for its first n elements,
+ which are equal to those of over. 
+</summary>
 </member>
 <member name="M:LuaAnalyzer.Utils.cover``2(Microsoft.FSharp.Collections.FSharpMap{``0,``1},Microsoft.FSharp.Collections.FSharpMap{``0,``1})">
 <summary>
  replace ctx1&apos;s entries where the two contexts have equal keys.
 </summary>
 </member>
+<member name="M:LuaAnalyzer.Utils.inRange(System.Int32,System.Int32,System.Int32)">
+<summary>
+ True iff lo &lt;= pos &lt;= hi
+ where (lo,hi) = rng
+</summary>
+</member>
+<member name="M:LuaAnalyzer.Utils.orderStr(System.Int32)">
+<summary>
+ Returns a string describing the order of the given integer
+</summary>
+</member>
 <member name="T:LuaAnalyzer.Utils">
 
 </member>

File LoveStudio/LuaAnalyzer/LoveAPI.xml

             <parameter>
               <name>allowed</name>
               <description>True if the body is allowed to sleep or false if not.</description>
-              <type variant="number"></type>
+              <type variant="boolean"></type>
             </parameter>
           </type>
         </method>
             <return>
               <name>canvas</name>
               <description>The Canvas set by setCanvas. Returns nil if drawing to the real screen.</description>
-              <type variant="unknown"></type>
+              <type variant="usertype">
+                <name>Canvas</name>
+              </type>
             </return>
           </type>
         </field>

File LoveStudio/LuaAnalyzer/LuaAnalyzer.fs

 /// The standard .NET generic list class. (A resizable array.)
 type GenList<'T> = System.Collections.Generic.List<'T>
 
-type public Error = string*LuaAnalyzer.Syntax.Range
+type public Error = string*Range
 
 let private ref_listStatErrors : Ref<Statement -> List<Error>> = 
     ref (fun x -> [])

File LoveStudio/LuaAnalyzer/Syntax.fs

 
 open Annotations
 
-type Range = int*int
-
-and Name = string
+type Name = string
 
 /// FunctionName(fieldNames, opt methodName)
 and FunctionName = List<Name>*Option<Name>

File LoveStudio/LuaAnalyzer/Token.fs

 module LuaAnalyzer.Token
 
-type Range = int*int
 type Pos = int
 type Annotation = Option<string>
 type ErrorExplanation = string

File LoveStudio/LuaAnalyzer/Type.fs

                 let lastField = 
                     let ty = Type.Coerce tenv accField.ty
                     match ty with
-                    | RecordTy(_,_,_,Closed,_,fields,_,_) when fields.ContainsKey last ->
+                    | RecordTy(_,_,_,_,_,fields,_,_) when fields.ContainsKey last ->
+                        // for open or closed records containing the field, we use the existing field
                         ty.[last]
                     | RecordTy(_,_,_,Open,_,_,_,_) ->
+                        // for open records which do not contain the field, this must be a new field
                         targetField
                     | _ ->
                         Field.OfType(UnknownTy)

File LoveStudio/LuaAnalyzer/TypedSyntax.fs

 open Annotations
 open Syntax
 open Type
-type Range = int*int
 
 ///
 /// A statement is an expression which denotes a command to the lua VM,

File LoveStudio/LuaAnalyzer/TypedSyntax.fsi

 open Annotations
 open Syntax //BinOp, UnOp
 open Type
-type Range = int*int
 
 ///
 /// A statement is an expression which denotes a command to the lua VM,

File platform/msvc2010/love.vcxproj

       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
       <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
       <ObjectFileName>%(Identity).obj</ObjectFileName>
-      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;VC_EXTRALEAN;DEBUG;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;VC_EXTRALEAN;NDEBUG;WIN32;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>
       </StringPooling>
       <MinimalRebuild>