Skip to content

Commit

Permalink
A draft of new .psi file
Browse files Browse the repository at this point in the history
Nothing really working but a draft for starting a new .psi in according
to the current grammar
http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc335818983
  • Loading branch information
ollka committed Mar 29, 2013
1 parent cd7c337 commit b285483
Show file tree
Hide file tree
Showing 11 changed files with 2,163 additions and 2,945 deletions.
1,286 changes: 81 additions & 1,205 deletions src/fsharper/Psi.FSharp/Psi.FSharp.csproj

Large diffs are not rendered by default.

@@ -1,4 +1,4 @@
namespace JetBrains.ReSharper.Psi.FSharp.Tree.Impl
namespace JetBrains.ReSharper.Psi.FSharp.Impl.Tree
{
public static class ChildRole
{
Expand Down
@@ -1,6 +1,7 @@
using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree;
using JetBrains.ReSharper.Psi.FSharp.Tree;

namespace JetBrains.ReSharper.Psi.FSharp.Tree.Impl
namespace JetBrains.ReSharper.Psi.FSharp.Impl.Tree
{
public abstract class FSharpCompositeElement : CompositeElement, IFSharpTreeNode
{
Expand Down
10 changes: 3 additions & 7 deletions src/fsharper/Psi.FSharp/src/Impl/Tree/FSharpExpressionBase.cs
@@ -1,9 +1,8 @@
using JetBrains.ReSharper.Psi.ExtensionsAPI.Resolve.Managed;
using JetBrains.ReSharper.Psi.FSharp.Tree;
using JetBrains.ReSharper.Psi.FSharp.Tree.Impl;
using JetBrains.ReSharper.Psi.Resolve;

namespace JetBrains.ReSharper.Psi.FSharp.Tree.Impl
namespace JetBrains.ReSharper.Psi.FSharp.Impl.Tree
{
abstract class FSharpExpressionBase : FSharpCompositeElement, IFSharpExpression//, IManagedExpressionImpl, IAccessContext
{
Expand All @@ -21,20 +20,17 @@ internal abstract class TypeExpressionBase : FSharpExpressionBase
{
}

// TODO: Is this an expression?
// TODO: Is this an expression?
internal abstract class PatternBase : FSharpExpressionBase
{
}

internal abstract class TypeVariableScopeBase : FSharpCompositeElement
{
// TODO: What should this class do?
// TODO: What should this class do?
}
}

// TODO: Define this to do something useful!
namespace JetBrains.ReSharper.Psi.FSharp.Impl.InferenceCacheSupport
{
abstract class InferenceErrorBase : FSharpCompositeElement
{
}
Expand Down
@@ -1,4 +1,4 @@
namespace JetBrains.ReSharper.Psi.FSharp.Tree.Impl
namespace JetBrains.ReSharper.Psi.FSharp.Impl.Tree
{
internal partial class FSharpFile
{
Expand Down
@@ -1,6 +1,7 @@
using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree;
using JetBrains.ReSharper.Psi.FSharp.Tree;

namespace JetBrains.ReSharper.Psi.FSharp.Tree.Impl
namespace JetBrains.ReSharper.Psi.FSharp.Impl.Tree
{
public abstract class FSharpFileElement : FileElementBase
{
Expand Down
86 changes: 77 additions & 9 deletions src/fsharper/Psi.FSharp/src/Parsing/FSharpParser.cs
@@ -1,5 +1,8 @@
using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree;
using JetBrains.ReSharper.Psi.FSharp.Tree.Impl;
using JetBrains.ReSharper.Psi.FSharp.Gen;
using JetBrains.ReSharper.Psi.FSharp.Impl.Tree;
using JetBrains.ReSharper.Psi.FSharp.Tree;
using JetBrains.ReSharper.Psi.VB.Parsing;

namespace JetBrains.ReSharper.Psi.FSharp.Parsing
{
Expand All @@ -9,27 +12,92 @@ namespace JetBrains.ReSharper.Psi.FSharp.Parsing

internal class FSharpParser : FSharpParserGenerated, IFSharpParser
{
private readonly ILexer<int> originalLexer;
private readonly ILexer<int> myOriginalLexer;

public FSharpParser(ILexer<int> lexer, IEnumerable<PreProcessingDirective> defines)
{
originalLexer = lexer;

setLexer(originalLexer);
myOriginalLexer = lexer;
setLexer(myOriginalLexer);
}

public IFile ParseFile()
{
return (FSharpFile)parseFSharpFile();
return (IFSharpFile)parseFSharpFile();
}

private static bool IsIdentifier(NodeType tokenType)
{
return tokenType == VBTokenType.IDENTIFIER;
}

// TODO: Not really sure why this has to be abstract
// but changing it changes the interface that gets generated
public override TreeElement parseIdentifier()
{
if (myLexer.TokenType != FSharpTokenType.IDENTIFIER)
if (!IsIdentifier(myLexer.TokenType))
throw new UnexpectedToken(ParserMessages.GetExpectedMessage(ParserMessages.GetString(ParserMessages.IDS__IDENTIFIER)));
return createToken();
}

public override TreeElement parseFSharpFile()
{
var result = TreeElementFactory.CreateCompositeElement(ElementType.F_SHARP_FILE);
var tokenType = myLexer.TokenType;
if (tokenType == FSharpTokenType.NAMESPACE_KEYWORD)
{
while (tokenType == FSharpTokenType.NAMESPACE_KEYWORD)
{
result.AppendNewChild(parseNamespaceDeclaration());
tokenType = myLexer.TokenType;
}
}
else if (tokenType == FSharpTokenType.MODULE_KEYWORD)
{
result.AppendNewChild(parsePrimaryModuleDeclaration());
}
else
{
result.AppendNewChild(parseAnonymousModuleDeclaration());
}
return result;
}

public override TreeElement parsePrimaryModuleDeclaration()
{
var result = TreeElementFactory.CreateCompositeElement(ElementType.PRIMARY_MODULE_DECLARATION);
try
{
result.AppendNewChild(match(FSharpTokenType.MODULE_KEYWORD));
var qualifiedNamespaceName = (IQualifiedNamespaceUsage)parseQualifiedNamespaceUsage();
result.AppendNewChild((TreeElement)qualifiedNamespaceName.Qualifier);
result.AppendNewChild((TreeElement)qualifiedNamespaceName.Dot);
result.AppendNewChild((TreeElement)qualifiedNamespaceName.NameIdentifier);
result.AppendNewChild(parseModuleBody());
}
catch (SyntaxError e)
{
if (e.ParsingResult != null)
result.AppendNewChild(e.ParsingResult);
e.ParsingResult = result;
handleErrorInModuleDeclaration(result, e);
}
return result;
}

public override TreeElement parseQualifiedNamespaceUsage()
{
var result = TreeElementFactory.CreateCompositeElement(ElementType.QUALIFIED_NAMESPACE_USAGE);
result.AppendNewChild(parseIdentifier());

while (myLexer.TokenType == VBTokenType.DOT)
{
var qualifiedNamespaceName = TreeElementFactory.CreateCompositeElement(ElementType.QUALIFIED_NAMESPACE_USAGE);
qualifiedNamespaceName.AppendNewChild(result);
qualifiedNamespaceName.AppendNewChild(match(FSharpTokenType.DOT));
qualifiedNamespaceName.AppendNewChild(parseIdentifier());

result = qualifiedNamespaceName;
}

return result;
}
}
}
4 changes: 2 additions & 2 deletions src/fsharper/Psi.FSharp/src/Parsing/FSharpTokenType.cs
Expand Up @@ -147,7 +147,7 @@ public override LeafElementBase Create(IBuffer buffer, TreeOffset startOffset, T

public override string TokenRepresentation
{
get { throw new NotImplementedException(); }
get { return "indent01"; }
}
}

Expand Down Expand Up @@ -420,7 +420,7 @@ static FSharpTokenType()

public static readonly TokenNodeType NEW_LINE = new NewLineNodeType();
public static readonly TokenNodeType END_OF_LINE_COMMENT = new EndOfLineCommentNodeType();

// todo: this is (arguably) wrong
public static readonly TokenNodeType C_STYLE_COMMENT = new CommentNodeType("C_STYLE_COMMENT", "(* comment *)");

Expand Down
8 changes: 8 additions & 0 deletions src/fsharper/Psi.FSharp/src/Parsing/ParserMessages.cs
Expand Up @@ -14,6 +14,14 @@ public class ParserMessages

public const string IDS__IDENTIFIER = "identifier";

public const string IDS_MODULE_ELEMENT = "module";
public const string IDS_PRIMARY_NAMESPACE_DECLARATION = "namespace declaration";
public const string IDS_GLOBAL_NAMESPACE_DECLARATION = "namespace declaration";
public const string IDS_ACCESS_MODIFIER = "modifier";
public const string IDS_ATTRIBUTE_SECTION = "attribute";
public const string IDS_TYPE_PARAMETER_CONSTRAINT = "type parameter constraint";
public const string IDS_TYPE_PARAMETER_USAGE = "type parameter";

public const string IDS_BINARY_EXPRESSION = "expression";
public const string IDS_BINDING_SCHEME = "binding scheme";
public const string IDS_BINDING_SOURCE = "binding source";
Expand Down

0 comments on commit b285483

Please sign in to comment.