package com.innovatian.idea.powershell.lang.parser; import com.innovatian.idea.powershell.lang.parser.parsing.ParserUtils; import com.intellij.lang.PsiBuilder; import com.intellij.psi.tree.IElementType; public class StringConstructorExpression implements PsElementTypes { public static IElementType parse(PsiBuilder builder, PsParser parser) { PsiBuilder.Marker sMarker = builder.mark(); if (ParserUtils.getToken(builder, EXPSTRING_BEGIN)) { ParserUtils.getToken(builder, EXPSTRING_CONTENT); if (EXPSTRING_END.equals(builder.getTokenType())) { sMarker.rollbackTo(); sMarker = builder.mark(); ParserUtils.advance(builder); ParserUtils.advance(builder); ParserUtils.advance(builder); sMarker.done(LITERAL); return LITERAL; } IElementType tokenType = builder.getTokenType(); while (EXPSTRING_CONTENT.equals(tokenType) || DOLLAR.equals(tokenType)) { if (DOLLAR.equals(builder.getTokenType())) { stringConstructorValuePart(builder, parser); } else { final PsiBuilder.Marker content = builder.mark(); builder.advanceLexer(); content.done(EXPSTRING_CONTENT); } tokenType = builder.getTokenType(); } ParserUtils.getToken(builder, EXPSTRING_END, "string.end.expected"); sMarker.done(EXPSTRING); return EXPSTRING; } else { sMarker.drop(); return WRONGWAY; } } private static void stringConstructorValuePart(PsiBuilder builder, PsParser parser) { final PsiBuilder.Marker injection = builder.mark(); ParserUtils.getToken(builder, DOLLAR); final IElementType tokenType = builder.getTokenType(); if (LCURLY.equals(tokenType)) { parser.parseClosableBlock(builder); } else if (IDENT.equals(tokenType)) { builder.advanceLexer(); } else { ParserUtils.wrapError(builder, "identifier.or.block.expected"); } injection.done(PSSTRING_INJECTION); } }