package org.fugazi.qls.ast;
import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.misc.NotNull;
import org.fugazi.ql.ast.AbstractASTNode;
import org.fugazi.ql.ast.type.BoolType;
import org.fugazi.ql.ast.type.IntType;
import org.fugazi.ql.ast.type.StringType;
import org.fugazi.ql.ast.type.Type;
import org.fugazi.qls.ast.question.QLSQuestion;
import org.fugazi.qls.ast.segment.Page;
import org.fugazi.qls.ast.segment.Section;
import org.fugazi.qls.ast.style.DefaultStyleDeclaration;
import org.fugazi.qls.ast.style.Style;
import org.fugazi.qls.ast.style.UndefinedStyle;
import org.fugazi.qls.ast.style.style_property.*;
import org.fugazi.qls.ast.stylesheet.StyleSheet;
import org.fugazi.qls.ast.widget.*;
import org.fugazi.qls.parser.QLSBaseVisitor;
import org.fugazi.qls.parser.QLSParser;
import java.util.ArrayList;
import java.util.List;
public class FugaziQLSVisitor extends QLSBaseVisitor<AbstractASTNode> {
private String removeStringQuotes(String _str) {
return _str.replaceAll("^\"|\"$", "");
}
private int getLineNumber(ParserRuleContext ctx) {
return ctx.getStart().getLine();
}
@Override
public AbstractASTNode visitStylesheet(@NotNull QLSParser.StylesheetContext ctx) {
String name = ctx.ID().getText();
List<Page> pages = new ArrayList<>();
for (QLSParser.PageContext pageContext : ctx.page()) {
Page page = (Page) pageContext.accept(this);
pages.add(page);
}
StyleSheet styleSheet = new StyleSheet(name, pages);
styleSheet.setLineNumber(this.getLineNumber(ctx));
return styleSheet;
}
@Override
public AbstractASTNode visitPage(@NotNull QLSParser.PageContext ctx) {
String name = ctx.ID().getText();
List<Section> sections = new ArrayList<>();
for (QLSParser.SectionContext sectionContext : ctx.section()) {
Section section = (Section) sectionContext.accept(this);
sections.add(section);
}
List<DefaultStyleDeclaration> defaultStyles = new ArrayList<>();
for (QLSParser.DefaultStyleDeclrContext defaultStyleDeclrContext : ctx.defaultStyleDeclr()) {
DefaultStyleDeclaration defaultStyle = (DefaultStyleDeclaration) defaultStyleDeclrContext.accept(this);
defaultStyles.add(defaultStyle);
}
Page page = new Page(name, sections, defaultStyles);
page.setLineNumber(this.getLineNumber(ctx));
return page;
}
@Override
public AbstractASTNode visitSection(@NotNull QLSParser.SectionContext ctx) {
String name = ctx.STRING().getText();
List<Section> sections = new ArrayList<>();
for (QLSParser.SectionContext sectionContext : ctx.section()) {
Section section = (Section) sectionContext.accept(this);
sections.add(section);
}
List<QLSQuestion> questions = new ArrayList<>();
for (QLSParser.QuestionContext questionContext : ctx.question()) {
QLSQuestion question = (QLSQuestion) questionContext.accept(this);
questions.add(question);
}
List<DefaultStyleDeclaration> defaultStyles = new ArrayList<>();
for (QLSParser.DefaultStyleDeclrContext defaultStyleDeclrContext : ctx.defaultStyleDeclr()) {
DefaultStyleDeclaration defaultStyle = (DefaultStyleDeclaration) defaultStyleDeclrContext.accept(this);
defaultStyles.add(defaultStyle);
}
Section section = new Section(this.removeStringQuotes(name), sections, defaultStyles, questions);
section.setLineNumber(this.getLineNumber(ctx));
return section;
}
@Override public AbstractASTNode visitQuestionWithWidget(@NotNull QLSParser.QuestionWithWidgetContext ctx) {
String identifier = ctx.ID().getText();
AbstractQLSWidget widget = (AbstractQLSWidget) ctx.widget().accept(this);
widget.setLabel(identifier);
QLSQuestion qlsQuestion = new QLSQuestion(identifier, widget);
qlsQuestion.setLineNumber(this.getLineNumber(ctx));
return qlsQuestion;
}
@Override public AbstractASTNode visitQuestionWithoutWidget(@NotNull QLSParser.QuestionWithoutWidgetContext ctx) {
String identifier = ctx.ID().getText();
QLSQuestion qlsQuestion = new QLSQuestion(identifier, new QLSUndefinedWidget());
qlsQuestion.setLineNumber(this.getLineNumber(ctx));
return qlsQuestion;
}
@Override
public AbstractASTNode visitWidget(@NotNull QLSParser.WidgetContext ctx) {
return ctx.supportedWidget().accept(this);
}
@Override
public AbstractASTNode visitNoStylesDefaultDeclr(@NotNull QLSParser.NoStylesDefaultDeclrContext ctx) {
Type questionType = (Type) ctx.type().accept(this);
AbstractQLSWidget widget = (AbstractQLSWidget) ctx.widget().accept(this);
DefaultStyleDeclaration defaultStyleDeclaration =
new DefaultStyleDeclaration(new UndefinedStyle(), widget.getType(), questionType);
defaultStyleDeclaration.setLineNumber(this.getLineNumber(ctx));
return defaultStyleDeclaration;
}
@Override
public AbstractASTNode visitStylesDefaultDeclr(@NotNull QLSParser.StylesDefaultDeclrContext ctx) {
Type questionType = (Type) ctx.type().accept(this);
AbstractQLSWidget widget = (AbstractQLSWidget) ctx.widget().accept(this);
List<StyleProperty> styleProperties = new ArrayList<>();
for (QLSParser.StylePropertyContext stylePropertyContext : ctx.styleProperty()) {
StyleProperty styleProperty = (StyleProperty) stylePropertyContext.accept(this);
styleProperties.add(styleProperty);
}
Style style = new Style(styleProperties);
style.setLineNumber(this.getLineNumber(ctx));
DefaultStyleDeclaration defaultStyleDeclaration =
new DefaultStyleDeclaration(style, widget.getType(), questionType);
defaultStyleDeclaration.setLineNumber(this.getLineNumber(ctx));
return defaultStyleDeclaration;
}
@Override
public AbstractASTNode visitCheckboxWidget(@NotNull QLSParser.CheckboxWidgetContext ctx) {
QLSCheckBox widget = new QLSCheckBox();
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitRadioWidget(@NotNull QLSParser.RadioWidgetContext ctx) {
String yesLabel = ctx.yes.getText();
String noLabel = ctx.no.getText();
QLSRadioBtn widget = new QLSRadioBtn(this.removeStringQuotes(yesLabel), this.removeStringQuotes(noLabel));
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitDropdownWidget(@NotNull QLSParser.DropdownWidgetContext ctx) {
String yesLabel = ctx.yes.getText();
String noLabel = ctx.no.getText();
QLSDropdown widget = new QLSDropdown(this.removeStringQuotes(yesLabel), this.removeStringQuotes(noLabel));
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitSpinboxWidget(@NotNull QLSParser.SpinboxWidgetContext ctx) {
QLSSpinBox widget = new QLSSpinBox();
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitSliderWidget(@NotNull QLSParser.SliderWidgetContext ctx) {
QLSSlider widget = new QLSSlider();
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitTextWidget(@NotNull QLSParser.TextWidgetContext ctx) {
QLSTextBox widget = new QLSTextBox();
widget.setLineNumber(this.getLineNumber(ctx));
return widget;
}
@Override
public AbstractASTNode visitWidthStyleProperty(@NotNull QLSParser.WidthStylePropertyContext ctx) {
Width styleProperty = new Width(Integer.parseInt(ctx.NUMBER().getText()));
styleProperty.setLineNumber(this.getLineNumber(ctx));
return styleProperty;
}
@Override
public AbstractASTNode visitFontStyleProperty(@NotNull QLSParser.FontStylePropertyContext ctx) {
Font styleProperty = new Font(this.removeStringQuotes(ctx.STRING().getText()));
styleProperty.setLineNumber(this.getLineNumber(ctx));
return styleProperty;
}
@Override
public AbstractASTNode visitFontsizeStyleProperty(@NotNull QLSParser.FontsizeStylePropertyContext ctx) {
FontSize styleProperty = new FontSize(Integer.parseInt(ctx.NUMBER().getText()));
styleProperty.setLineNumber(this.getLineNumber(ctx));
return styleProperty;
}
@Override
public AbstractASTNode visitColorStyleProperty(@NotNull QLSParser.ColorStylePropertyContext ctx) {
Color styleProperty = new Color(
Integer.decode(this.removeStringQuotes(ctx.HEX().getText()))
);
styleProperty.setLineNumber(this.getLineNumber(ctx));
return styleProperty;
}
@Override
public AbstractASTNode visitBoolType(@NotNull QLSParser.BoolTypeContext ctx) {
BoolType type = new BoolType();
type.setLineNumber(this.getLineNumber(ctx));
return type;
}
@Override
public AbstractASTNode visitIntType(@NotNull QLSParser.IntTypeContext ctx) {
IntType type = new IntType();
type.setLineNumber(this.getLineNumber(ctx));
return type;
}
@Override
public AbstractASTNode visitStringType(@NotNull QLSParser.StringTypeContext ctx) {
StringType type = new StringType();
type.setLineNumber(this.getLineNumber(ctx));
return type;
}
}