Skip to content

Commit

Permalink
Fixes #9, Internal error in FSI: FS0192: binding null type in envBind…
Browse files Browse the repository at this point in the history
…TypeRef #9

Fixes #10, internal error: binding null type in envBindTypeRef

Both issues were caused by the same underlying issue.  RefEmit automagically applies escaping to names that contain a ','  So ``,`` becomes ``\,``.  When we tried to create a ref to a nested type we didn't add the ',' escaping so we couldnot bind to the created type.

The fix is very straightforward, change BasicQualifiedName to correctly escape names with comma's.
  • Loading branch information
KevinRansom committed Feb 22, 2015
1 parent c651690 commit 4267370
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/absil/il.fs
Original file line number Diff line number Diff line change
Expand Up @@ -678,8 +678,8 @@ type ILTypeRef =

member tref.FullName = String.concat "." (tref.Enclosing @ [tref.Name])

member tref.BasicQualifiedName =
String.concat "+" (tref.Enclosing @ [ tref.Name ])
member tref.BasicQualifiedName =
(String.concat "+" (tref.Enclosing @ [ tref.Name ] )).Replace(",", @"\,")

member tref.AddQualifiedNameExtensionWithNoShortPrimaryAssembly(basic) =
let sco = tref.Scope.QualifiedNameWithNoShortPrimaryAssembly
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
//<Expects status=success></Expects>
open System
open System.Reflection

open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Quotations.Patterns
open Microsoft.FSharp.Quotations.DerivedPatterns

let failures = ref false
let report_failure () =
stderr.WriteLine " NO"; failures := true
let test s b = stderr.Write(s:string); if b then stderr.WriteLine " OK" else report_failure()

(*--------------------*)

// Test cases for Github Issue # 10 module cannot contain ,

// Comma in module name
module ``,`` =
let x = 3

// Lots of comma's in module name
module ``,,,,,,,,,,,`` =
let x = 5

// Lots of comma's and other characters in module name
module ``One, 2, Three, 4, Five`` =
let x = 7

// Nested modules with commas
module ``Nested modules with commas`` =
module ``One, `` =
module ``Two, `` =
module ``Three, `` =
let x = 9

module ``Comma in type name`` =
type ``,`` =
static member x = 13

// Lots of comma's in type name
module ``Lots of comma's in type name`` =
type ``,,,,,,,`` =
static member x = 15

// Lots of comma's and other characters in type name
module ``Lots of comma's and other characters in type name`` =
type ``One, 2, Three, 4, Five`` =
static member x = 17

do
let eval expr value = if (expr) = value then true else false

test "Comma in module name" (eval ``,``.x 3)
test "Lots of comma's in module name" (eval ``,,,,,,,,,,,``.x 5)
test "Lots of comma's and other characters in module name" (eval ``One, 2, Three, 4, Five``.x 7)
test "Nested modules with commas" (eval ``Nested modules with commas``.``One, ``.``Two, ``.``Three, ``.x 9)

test "Comma in type name" (eval ``Comma in type name``.``,``.x 13)
test "Lots of comma's in type name" (eval ``Lots of comma's in type name``.``,,,,,,,``.x 15)
test "Lots of comma's and other characters in type name" (eval ``Lots of comma's and other characters in type name``.``One, 2, Three, 4, Five``.x 17)

let eval expr value = (match expr with | PropertyGet (a, b, c) -> (if (b.GetGetMethod(true) :> MethodBase).Invoke(null, null) :?>int = value then true else false) | _ -> false)

test "Comma in module name from quotation" (eval <@@ ``,``.x @@> 3)
test "Lots of comma's in module name from quotation" (eval <@@ ``,,,,,,,,,,,``.x @@> 5)
test "Lots of comma's and other characters in module name from quotation" (eval <@@ ``One, 2, Three, 4, Five``.x @@> 7)
test "Nested modules with commas from quotation" (eval <@@ ``Nested modules with commas``.``One, ``.``Two, ``.``Three, ``.x @@> 9)

test "Comma in type name from quotation" (eval <@@ ``Comma in type name``.``,``.x @@> 13)
test "Lots of comma's in type name from quotation" (eval <@@ ``Lots of comma's in type name``.``,,,,,,,``.x @@> 15)
test "Lots of comma's and other characters in type name from quotation" (eval <@@ ``Lots of comma's and other characters in type name``.``One, 2, Three, 4, Five``.x @@> 17)

let aa =
if !failures then (stdout.WriteLine "Test Failed"; exit 1)

do (stdout.WriteLine "Test Passed";
System.IO.File.WriteAllText("test.ok","ok");
exit 0)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
SOURCE=E_KeywordIdent01.fs # E_KeywordIdent01.fs
SOURCE=E_ValidIdentifier03.fs SCFLAGS="--test:ErrorRanges" # E_ValidIdentifier03.fs
SOURCE=E_ValidIdentifier04.fs # E_ValidIdentifier04.fs

SOURCE=backtickmoduleandtypenames.fsx # backtickmoduleandtypenames.fsx
SOURCE=backtickmoduleandtypenames.fsx FSIMODE=EXEC COMPILE_ONLY=1 # backtickmoduleandtypenames.fsx FSIMODE=EXEC COMPILE_ONLY=1

SOURCE=StructNotAllowDoKeyword.fs # StructNotAllowDoKeyword.fs
SOURCE=E_MissingQualification.fs SCFLAGS="--test:ErrorRanges" # E_MissingQualification.fs

Expand Down

0 comments on commit 4267370

Please sign in to comment.