/*
* Copyright 2013-2017 consulo.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package consulo.csharp.lang.parser.decl;
import consulo.csharp.lang.parser.CSharpBuilderWrapper;
import consulo.csharp.lang.parser.ModifierSet;
import consulo.csharp.lang.parser.exp.ExpressionParsing;
import com.intellij.lang.PsiBuilder;
import com.intellij.psi.tree.IElementType;
/**
* @author VISTALL
* @since 28.11.13.
*/
public class FieldOrPropertyParsing extends MemberWithBodyParsing
{
public static void parseFieldOrLocalVariableAtTypeWithDone(CSharpBuilderWrapper builder, PsiBuilder.Marker marker, IElementType to, int typeFlags, boolean semicolonEat, ModifierSet set)
{
TypeInfo typeInfo = parseType(builder, typeFlags);
if(typeInfo == null)
{
builder.error("Type expected");
if(semicolonEat)
{
expect(builder, SEMICOLON, "';' expected");
}
marker.done(to);
}
else
{
parseFieldOrLocalVariableAtNameWithDone(builder, marker, to, typeFlags, semicolonEat, set);
}
}
public static boolean parseFieldOrLocalVariableAtNameWithDone(CSharpBuilderWrapper builder, PsiBuilder.Marker marker, IElementType to, int typeFlags, boolean semicolonEat, ModifierSet set)
{
if(expectOrReportIdentifier(builder, typeFlags))
{
parseFieldAfterName(builder, marker, to, typeFlags, semicolonEat, set);
return true;
}
else
{
if(semicolonEat)
{
expect(builder, SEMICOLON, "';' expected");
}
marker.done(to);
return false;
}
}
private static PsiBuilder.Marker parseFieldAfterName(CSharpBuilderWrapper builder, PsiBuilder.Marker marker, IElementType to, int typeFlags, boolean semicolonEat, ModifierSet set)
{
if(builder.getTokenType() == EQ || builder.getTokenType() == DARROW)
{
builder.advanceLexer();
if(ExpressionParsing.parseVariableInitializer(builder, set) == null)
{
builder.error("Expression expected");
}
}
if(builder.getTokenType() == COMMA)
{
builder.advanceLexer();
marker.done(to);
PsiBuilder.Marker newMarker = builder.mark();
parseFieldOrLocalVariableAtNameWithDone(builder, newMarker, to, typeFlags, semicolonEat, set);
return marker;
}
else
{
if(semicolonEat)
{
expect(builder, SEMICOLON, "';' expected");
}
done(marker, to);
return marker;
}
}
public static void parseArrayAfterThis(CSharpBuilderWrapper builderWrapper, PsiBuilder.Marker marker, ModifierSet set)
{
if(builderWrapper.getTokenType() == LBRACKET)
{
MethodParsing.parseParameterList(builderWrapper, STUB_SUPPORT, RBRACKET, set);
}
else
{
builderWrapper.error("'[' expected");
}
parseAccessors(builderWrapper, XXX_ACCESSOR, PROPERTY_ACCESSOR_START);
done(marker, ARRAY_METHOD_DECLARATION);
}
public static void parseFieldOrPropertyAfterName(CSharpBuilderWrapper builderWrapper, PsiBuilder.Marker marker, ModifierSet set)
{
if(builderWrapper.getTokenType() == LBRACE)
{
parseAccessors(builderWrapper, XXX_ACCESSOR, PROPERTY_ACCESSOR_START);
if(builderWrapper.getTokenType() == EQ)
{
builderWrapper.advanceLexer();
if(ExpressionParsing.parseVariableInitializer(builderWrapper, set) == null)
{
builderWrapper.error("Expression expected");
}
expect(builderWrapper, SEMICOLON, "';' expected");
}
marker.done(PROPERTY_DECLARATION);
}
else
{
parseFieldAfterName(builderWrapper, marker, FIELD_DECLARATION, STUB_SUPPORT, true, set);
}
}
}