Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit 0052144

Browse files
authored
Merge pull request #917 from microsoft/samarsha/hm-module
Add Hindley-Milner type inference module
2 parents a748db9 + 2bc04a4 commit 0052144

31 files changed

+1182
-250
lines changed

src/QsCompiler/BondSchemas/BondSchemaTranslator.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -536,9 +536,7 @@ private static QsTypeParameter ToBondSchema(this SyntaxTree.QsTypeParameter qsTy
536536
{
537537
Origin = qsTypeParameter.Origin.ToBondSchema(),
538538
TypeName = qsTypeParameter.TypeName,
539-
Range = qsTypeParameter.Range.IsNull ?
540-
null :
541-
qsTypeParameter.Range.Item.ToBondSchema()
539+
Range = null
542540
};
543541

544542
private static QsValueUpdate ToBondSchema(this SyntaxTree.QsValueUpdate valueUpdate) =>
@@ -675,9 +673,7 @@ private static UserDefinedType ToBondSchema(this SyntaxTree.UserDefinedType user
675673
{
676674
Namespace = userDefinedType.Namespace,
677675
Name = userDefinedType.Name,
678-
Range = userDefinedType.Range.IsNull ?
679-
null :
680-
userDefinedType.Range.Item.ToBondSchema()
676+
Range = null
681677
};
682678

683679
private static CharacteristicsKindComposition<TBond> ToBondSchemaGeneric<TBond, TCompiler>(

src/QsCompiler/BondSchemas/CompilerObjectTranslator.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,7 @@ private static SyntaxTree.QsTypeParameter ToCompilerObject(this QsTypeParameter
537537
new SyntaxTree.QsTypeParameter(
538538
origin: bondQsTypeParameter.Origin.ToCompilerObject(),
539539
typeName: bondQsTypeParameter.TypeName,
540-
range: bondQsTypeParameter.Range != null ?
541-
bondQsTypeParameter.Range.ToCompilerObject().ToQsNullableGeneric() :
542-
QsNullable<DataTypes.Range>.Null);
540+
range: QsNullable<DataTypes.Range>.Null);
543541

544542
private static SyntaxTree.QsWhileStatement ToCompilerObject(this QsWhileStatement bondQsWhileStatement) =>
545543
new SyntaxTree.QsWhileStatement(
@@ -653,9 +651,7 @@ private static SyntaxTree.UserDefinedType ToCompilerObject(this UserDefinedType
653651
new SyntaxTree.UserDefinedType(
654652
@namespace: bondUserDefinedType.Namespace,
655653
name: bondUserDefinedType.Name,
656-
range: bondUserDefinedType.Range != null ?
657-
bondUserDefinedType.Range.ToCompilerObject().ToQsNullableGeneric() :
658-
QsNullable<DataTypes.Range>.Null);
654+
range: QsNullable<DataTypes.Range>.Null);
659655

660656
private static Tuple<SyntaxTree.SymbolTuple, SyntaxTree.ResolvedType> ToCompilerObject(this QsLoopItem bondQsLoopItem) =>
661657
new Tuple<SyntaxTree.SymbolTuple, SyntaxTree.ResolvedType>(

src/QsCompiler/CompilationManager/Diagnostics.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -83,34 +83,32 @@ internal static Diagnostic Generate(string filename, QsCompilerDiagnostic msg, P
8383
Range = ((positionOffset ?? Position.Zero) + msg.Range).ToLsp()
8484
};
8585

86-
internal const string QsCodePrefix = "QS";
86+
private const string CodePrefix = "QS";
87+
88+
internal static string CodeString(int code) => CodePrefix + code.ToString("D4");
8789

8890
public static bool TryGetCode(string str, out int code)
8991
{
9092
code = -1;
9193
str = str?.Trim() ?? "";
9294
return !string.IsNullOrWhiteSpace(str) &&
93-
str.StartsWith(QsCodePrefix, StringComparison.InvariantCultureIgnoreCase) &&
95+
str.StartsWith(CodePrefix, StringComparison.InvariantCultureIgnoreCase) &&
9496
int.TryParse(str.Substring(2), out code);
9597
}
9698
}
9799

98100
public static class Informations
99101
{
100-
public static string Code(this InformationCode code) =>
101-
Information((int)code);
102+
public static string Code(this InformationCode code) => Information((int)code);
102103

103-
internal static string Information(int code) =>
104-
$"{Diagnostics.QsCodePrefix}{code}";
104+
internal static string Information(int code) => Diagnostics.CodeString(code);
105105
}
106106

107107
public static class Warnings
108108
{
109-
public static string Code(this WarningCode code) =>
110-
Warning((int)code);
109+
public static string Code(this WarningCode code) => Warning((int)code);
111110

112-
internal static string Warning(int code) =>
113-
$"{Diagnostics.QsCodePrefix}{code}";
111+
internal static string Warning(int code) => Diagnostics.CodeString(code);
114112

115113
// warnings 70**
116114

@@ -141,11 +139,9 @@ internal static Diagnostic EmptyStatementWarning(string filename, Position pos)
141139

142140
public static class Errors
143141
{
144-
public static string Code(this ErrorCode code) =>
145-
Error((int)code);
142+
public static string Code(this ErrorCode code) => Error((int)code);
146143

147-
internal static string Error(int code) =>
148-
$"{Diagnostics.QsCodePrefix}{code}";
144+
internal static string Error(int code) => Diagnostics.CodeString(code);
149145

150146
// errors 70**
151147

src/QsCompiler/CompilationManager/TypeChecking.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -870,9 +870,7 @@ private static bool TryBuildIfStatement(
870870
var buildClause = BuildStatement(
871871
nodes.Current,
872872
(relPos, ctx) => Statements.NewConditionalBlock(nodes.Current.Fragment.Comments, relPos, ctx, ifCond.Item),
873-
#pragma warning disable 612 // WithinIfCondition is obsolete.
874-
context.WithinIfCondition,
875-
#pragma warning restore 612
873+
context,
876874
diagnostics);
877875
var ifBlock = buildClause(BuildScope(nodes.Current.Children.GetEnumerator(), context, diagnostics));
878876

@@ -884,9 +882,7 @@ private static bool TryBuildIfStatement(
884882
buildClause = BuildStatement(
885883
nodes.Current,
886884
(relPos, ctx) => Statements.NewConditionalBlock(nodes.Current.Fragment.Comments, relPos, ctx, elifCond.Item),
887-
#pragma warning disable 612 // WithinIfCondition is obsolete.
888-
context.WithinIfCondition,
889-
#pragma warning restore 612
885+
context,
890886
diagnostics);
891887
elifBlocks.Add(buildClause(BuildScope(nodes.Current.Children.GetEnumerator(), context, diagnostics)));
892888
proceed = nodes.MoveNext();

src/QsCompiler/Core/ConstructorExtensions.fs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,30 @@
33

44
module Microsoft.Quantum.QsCompiler.SyntaxExtensions
55

6+
#nowarn "44" // TypeParameter.Range and UserDefinedType.Range are deprecated.
7+
8+
open System
69
open System.Collections.Generic
7-
open System.Collections.ObjectModel
810
open System.Collections.Immutable
11+
open System.Collections.ObjectModel
912
open System.Linq
13+
14+
open Microsoft.Quantum.QsCompiler.DataTypes
1015
open Microsoft.Quantum.QsCompiler.SyntaxTokens
1116
open Microsoft.Quantum.QsCompiler.SyntaxTree
1217

13-
1418
type QsQualifiedName with
1519
static member New(nsName, cName) = { Namespace = nsName; Name = cName }
1620

1721
type UserDefinedType with
22+
static member New(ns, name) =
23+
{
24+
Namespace = ns
25+
Name = name
26+
Range = Null
27+
}
28+
29+
[<Obsolete "Use UserDefinedType.New(string, string) instead.">]
1830
static member New(nsName, tName, range) =
1931
{
2032
Namespace = nsName
@@ -23,6 +35,14 @@ type UserDefinedType with
2335
}
2436

2537
type QsTypeParameter with
38+
static member New(origin, name) =
39+
{
40+
Origin = origin
41+
TypeName = name
42+
Range = Null
43+
}
44+
45+
[<Obsolete "Use QsTypeParameter.New(string, string) instead.">]
2646
static member New(origin, tName, range) =
2747
{
2848
Origin = origin

src/QsCompiler/Core/SymbolResolution.fs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ open System
77
open System.Collections.Generic
88
open System.Collections.Immutable
99
open System.Linq
10+
1011
open Microsoft.Quantum.QsCompiler.DataTypes
1112
open Microsoft.Quantum.QsCompiler.Diagnostics
1213
open Microsoft.Quantum.QsCompiler.ReservedKeywords
13-
open Microsoft.Quantum.QsCompiler.SyntaxExtensions
1414
open Microsoft.Quantum.QsCompiler.SyntaxTokens
1515
open Microsoft.Quantum.QsCompiler.SyntaxTree
1616

@@ -599,17 +599,17 @@ module SymbolResolution =
599599
/// <exception cref="ArgumentException">The given source file is not listed as source of that namespace.</exception>
600600
let rec internal ResolveType (processUDT, processTypeParameter) (qsType: QsType) =
601601
let resolve = ResolveType(processUDT, processTypeParameter)
602-
let asResolvedType t = ResolvedType.New(true, t)
602+
let asResolvedType = TypeRange.annotated qsType.Range |> ResolvedType.create
603603
let buildWith builder ts = builder ts |> asResolvedType
604-
let invalid = InvalidType |> asResolvedType
604+
let invalid = asResolvedType InvalidType
605605
let range = qsType.Range.ValueOr Range.Zero
606606

607607
match qsType.Type with
608608
| ArrayType baseType -> [ baseType ] |> AccumulateInner resolve (buildWith (fun ts -> ArrayType ts.[0]))
609609
| TupleType items -> items |> AccumulateInner resolve (buildWith TupleType)
610610
| QsTypeKind.TypeParameter sym ->
611611
match sym.Symbol with
612-
| Symbol name -> processTypeParameter (name, sym.Range) |> fun (k, errs) -> k |> asResolvedType, errs
612+
| Symbol name -> processTypeParameter (name, sym.Range) |> fun (k, errs) -> asResolvedType k, errs
613613
| InvalidSymbol -> invalid, [||]
614614
| _ ->
615615
invalid,
@@ -631,24 +631,24 @@ module SymbolResolution =
631631
[ arg; res ] |> AccumulateInner resolve (buildWith (fun ts -> QsTypeKind.Function(ts.[0], ts.[1])))
632632
| UserDefinedType name ->
633633
match name.Symbol with
634-
| Symbol sym -> processUDT ((None, sym), name.Range) |> fun (k, errs) -> k |> asResolvedType, errs
634+
| Symbol sym -> processUDT ((None, sym), name.Range) |> fun (k, errs) -> asResolvedType k, errs
635635
| QualifiedSymbol (ns, sym) ->
636-
processUDT ((Some ns, sym), name.Range) |> fun (k, errs) -> k |> asResolvedType, errs
636+
processUDT ((Some ns, sym), name.Range) |> fun (k, errs) -> asResolvedType k, errs
637637
| InvalidSymbol -> invalid, [||]
638638
| MissingSymbol
639639
| OmittedSymbols
640640
| SymbolTuple _ -> invalid, [| range |> QsCompilerDiagnostic.Error(ErrorCode.ExpectingIdentifier, []) |]
641-
| UnitType -> QsTypeKind.UnitType |> asResolvedType, [||]
642-
| Int -> QsTypeKind.Int |> asResolvedType, [||]
643-
| BigInt -> QsTypeKind.BigInt |> asResolvedType, [||]
644-
| Double -> QsTypeKind.Double |> asResolvedType, [||]
645-
| Bool -> QsTypeKind.Bool |> asResolvedType, [||]
646-
| String -> QsTypeKind.String |> asResolvedType, [||]
647-
| Qubit -> QsTypeKind.Qubit |> asResolvedType, [||]
648-
| Result -> QsTypeKind.Result |> asResolvedType, [||]
649-
| Pauli -> QsTypeKind.Pauli |> asResolvedType, [||]
650-
| Range -> QsTypeKind.Range |> asResolvedType, [||]
651-
| InvalidType -> QsTypeKind.InvalidType |> asResolvedType, [||]
641+
| UnitType -> asResolvedType UnitType, [||]
642+
| Int -> asResolvedType Int, [||]
643+
| BigInt -> asResolvedType BigInt, [||]
644+
| Double -> asResolvedType Double, [||]
645+
| Bool -> asResolvedType Bool, [||]
646+
| String -> asResolvedType String, [||]
647+
| Qubit -> asResolvedType Qubit, [||]
648+
| Result -> asResolvedType Result, [||]
649+
| Pauli -> asResolvedType Pauli, [||]
650+
| Range -> asResolvedType Range, [||]
651+
| InvalidType -> asResolvedType InvalidType, [||]
652652
| MissingType -> NotSupportedException "missing type cannot be resolved" |> raise
653653

654654
/// <summary>

src/QsCompiler/Core/SymbolTable/NamespaceManager.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
namespace Microsoft.Quantum.QsCompiler.SymbolManagement
55

6+
#nowarn "44" // QsTypeParameter.Range and UserDefinedType.Range are deprecated.
7+
68
open System
79
open System.Collections.Generic
810
open System.Collections.Immutable

src/QsCompiler/Core/SyntaxGenerator.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ module SyntaxGenerator =
252252
| BuiltInKind.Function typeParams -> typeParams.[0]
253253
| _ -> ArgumentException "Length is expected to be a function" |> raise
254254

255-
let typeParameter = QsTypeParameter.New(callableName, typeParameterName, Null)
255+
let typeParameter = QsTypeParameter.New(callableName, typeParameterName)
256256

257257
let genArrayType =
258258
QsTypeKind.ArrayType(QsTypeKind.TypeParameter typeParameter |> ResolvedType.New) |> ResolvedType.New

src/QsCompiler/Core/SyntaxTreeExtensions.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
[<System.Runtime.CompilerServices.Extension>]
66
module Microsoft.Quantum.QsCompiler.SyntaxTreeExtensions
77

8+
#nowarn "44" // TypeParameter.Range and UserDefinedType.Range are deprecated.
9+
810
open System
911
open System.Collections.Generic
1012
open System.Collections.Immutable

src/QsCompiler/Core/Transformations/ExpressionTransformation.fs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -454,12 +454,9 @@ and ExpressionTransformationBase internal (options: TransformationOptions, _inte
454454
-> ImmutableDictionary<(QsQualifiedName * string), ResolvedType>
455455

456456
default this.OnTypeParamResolutions typeParams =
457-
let asTypeParameter (key) =
458-
QsTypeParameter.New(fst key, snd key, Null)
459-
460457
let filteredTypeParams =
461458
typeParams
462-
|> Seq.map (fun kv -> this.Types.OnTypeParameter(kv.Key |> asTypeParameter), kv.Value)
459+
|> Seq.map (fun kv -> QsTypeParameter.New(fst kv.Key, snd kv.Key) |> this.Types.OnTypeParameter, kv.Value)
463460
|> Seq.choose (function
464461
| TypeParameter tp, value -> Some((tp.Origin, tp.TypeName), this.Types.OnType value)
465462
| _ -> None)

0 commit comments

Comments
 (0)