Draco-lang / Compiler

The compiler repository for the Draco programming language.
Apache License 2.0
74 stars 9 forks source link

Throw a custom error when the compiler cannot locate fundamental types. #356

Closed Kuinox closed 5 months ago

Kuinox commented 7 months ago

Currently the compiler throw an error like this:

System.InvalidOperationException: Sequence contains no matching element
   at System.Linq.ThrowHelper.ThrowNoMatchException()
   at System.Linq.Enumerable.Single[MetadataAssemblySymbol](IEnumerable`1 source, Func`2 predicate)
   at Draco.Compiler.Internal.Symbols.WellKnownTypes.GetAssemblyWithNameAndToken(String name, Byte[] token)
   at Draco.Compiler.Internal.Symbols.WellKnownTypes.<get_SystemRuntime>b__27_0()
   at Draco.Compiler.Internal.InterlockedUtils.InitializeNull[MetadataAssemblySymbol](MetadataAssemblySymbol& field, Func`1 factory)
   at Draco.Compiler.Internal.Symbols.WellKnownTypes.get_SystemRuntime()
   at Draco.Compiler.Internal.Symbols.WellKnownTypes.<get_SystemChar>b__30_0()
   at Draco.Compiler.Internal.InterlockedUtils.InitializeNull[MetadataTypeSymbol](MetadataTypeSymbol& field, Func`1 factory)
   at Draco.Compiler.Internal.Symbols.WellKnownTypes.get_SystemChar()
   at Draco.Compiler.Internal.Symbols.Synthetized.IntrinsicSymbols.get_Char()
   at Draco.Compiler.Internal.Symbols.Synthetized.IntrinsicSymbols.GenerateIntrinsicSymbols()+MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1[[Draco.Compiler.Internal.Symbols.Symbol, Draco.Compiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[Symbol](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[Symbol](IEnumerable`1 source)
   at System.Collections.Immutable.ImmutableArray.CreateRange[Symbol](IEnumerable`1 items)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[Symbol](IEnumerable`1 items)
   at Draco.Compiler.Internal.Symbols.Synthetized.IntrinsicSymbols.BuildAllSymbols()
   at Draco.Compiler.Internal.InterlockedUtils.InitializeDefault[Symbol](ImmutableArray`1& field, Func`1 factory)
   at Draco.Compiler.Internal.Symbols.Synthetized.IntrinsicSymbols.get_AllSymbols()
   at Draco.Compiler.Internal.Binding.IntrinsicsBinder.get_DeclaredSymbols()
   at Draco.Compiler.Internal.Binding.IntrinsicsBinder.LookupLocal(LookupResult result, String name, LookupFlags& flags, Predicate`1 allowSymbol, SyntaxNode currentReference)
   at Draco.Compiler.Internal.Binding.Binder.LookupInternal(String name, Predicate`1 allowSymbol, SyntaxNode reference)
   at Draco.Compiler.Internal.Binding.Binder.LookupValueSymbol(String name, SyntaxNode reference, DiagnosticBag diagnostics)
   at Draco.Compiler.Internal.Binding.ImportBinder.<BindImport>g__BindImportPath|14_0(ImportPathSyntax syntax, <>c__DisplayClass14_0& )
   at Draco.Compiler.Internal.Binding.ImportBinder.<BindImport>g__BindImportPath|14_0(ImportPathSyntax syntax, <>c__DisplayClass14_0& )
   at Draco.Compiler.Internal.Binding.ImportBinder.BindImport(ImportDeclarationSyntax syntax, DiagnosticBag diagnostics)
   at Draco.Compiler.Internal.Binding.ImportBinder.BindImportItems(DiagnosticBag diagnostics)
   at Draco.Compiler.Internal.Binding.ImportBinder.<get_ImportItems>b__4_0()
   at Draco.Compiler.Internal.InterlockedUtils.InitializeDefault[ImportItem](ImmutableArray`1& field, Func`1 factory)
   at Draco.Compiler.Internal.Binding.ImportBinder.get_ImportItems()
   at Draco.Compiler.Api.Semantics.SemanticModel.GetDiagnostics(Nullable`1 span)
   at Draco.Compiler.Api.Semantics.SemanticModel.<get_Diagnostics>b__4_0()
   at Draco.Compiler.Internal.InterlockedUtils.InitializeDefault[Diagnostic](ImmutableArray`1& field, Func`1 factory)
   at Draco.Compiler.Api.Semantics.SemanticModel.get_Diagnostics()
   at Draco.Compiler.Api.Compilation.<>c.<get_Diagnostics>b__2_0(SemanticModel model)
   at System.Linq.Enumerable.SelectManySingleSelectorIterator`2[[Draco.Compiler.Api.Semantics.SemanticModel, Draco.Compiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Draco.Compiler.Api.Diagnostics.Diagnostic, Draco.Compiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
   at System.Linq.Enumerable.ConcatIterator`1[[Draco.Compiler.Api.Diagnostics.Diagnostic, Draco.Compiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
   at System.Collections.Generic.LargeArrayBuilder`1[[Draco.Compiler.Api.Diagnostics.Diagnostic, Draco.Compiler, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].AddRange(IEnumerable`1 items)
   at System.Collections.Generic.EnumerableHelpers.ToArray[Diagnostic](IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[Diagnostic](IEnumerable`1 source)
   at System.Collections.Immutable.ImmutableArray.CreateRange[Diagnostic](IEnumerable`1 items)
   at System.Collections.Immutable.ImmutableArray.ToImmutableArray[Diagnostic](IEnumerable`1 items)
   at Draco.Compiler.Api.Compilation.get_Diagnostics()
   at Draco.Compiler.Api.Compilation.Emit(Stream peStream, Stream pdbStream, Stream declarationTreeStream, Stream symbolTreeStream, Stream irStream)
   at Draco.Editor.Web.Program.RunScript(Compilation compilation)

When it cannot locate the fundamental types.
We should throw an helpful error instead.