1441 lines
43 KiB
C++
1441 lines
43 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
* @copyright 2017, Edouard DUPIN, all right reserved
|
|
* @license MPL-2 (see license file)
|
|
*/
|
|
#include <estyle/Generator.hpp>
|
|
#include <estyle/debug.hpp>
|
|
|
|
|
|
|
|
void estyle::Generator::indentationPush() {
|
|
m_indentation++;
|
|
}
|
|
|
|
void estyle::Generator::indentationPop() {
|
|
m_indentation--;
|
|
}
|
|
|
|
void estyle::Generator::offsetPush(int32_t _count) {
|
|
m_offsetStack.pushBack(_count);
|
|
m_offset += _count;
|
|
}
|
|
void estyle::Generator::offsetPushAuto() {
|
|
int32_t offset = 0;
|
|
for (int64_t iii=m_output.size()-1; iii>=0; --iii) {
|
|
if ( m_output[iii] == '\n'
|
|
|| m_output[iii] == '\t') {
|
|
break;
|
|
}
|
|
offset++;
|
|
}
|
|
offsetPush(offset-m_offset);
|
|
}
|
|
|
|
void estyle::Generator::offsetPop() {
|
|
m_offset -= m_offsetStack.back();
|
|
m_offsetStack.popBack();
|
|
}
|
|
|
|
|
|
void estyle::Generator::typePush(etk::String _data) {
|
|
m_typeStack.pushBack(_data);
|
|
m_type = m_typeStack.back();
|
|
}
|
|
void estyle::Generator::typePop() {
|
|
m_typeStack.popBack();
|
|
if (m_typeStack.size() != 0) {
|
|
m_type = m_typeStack.back();
|
|
} else {
|
|
m_type = "block";
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/ **
|
|
*
|
|
* /
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL (0)
|
|
/*
|
|
/ *!
|
|
*
|
|
* /
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL_EXCLAMATION (1)
|
|
/*
|
|
/ **
|
|
|
|
* /
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL_NO_STAR (2)
|
|
/*
|
|
/ *!
|
|
|
|
* /
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL_NO_STAR_EXCLAMATION (3)
|
|
/*
|
|
///
|
|
///
|
|
///
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL_SINGLE_LINE (4)
|
|
/*
|
|
//!
|
|
//!
|
|
//!
|
|
*/
|
|
#define DOXYGEN_MULTI_LINE__NORMAL_SINGLE_LINE_EXCLAMATION (5)
|
|
|
|
static void setPropertyDoxygenMultiLine(eproperty::List<int32_t>& _data) {
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL, "normal");
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL_EXCLAMATION, "normal-exclamation");
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL_NO_STAR, "no-star");
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL_NO_STAR_EXCLAMATION, "no-star-exclamation");
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL_SINGLE_LINE, "single-line");
|
|
_data.add(DOXYGEN_MULTI_LINE__NORMAL_SINGLE_LINE_EXCLAMATION, "single-line-exclamation");
|
|
}
|
|
|
|
estyle::BraceProperty::BraceProperty() :
|
|
inNewLineBefore(false),
|
|
inNewLineAfter(false),
|
|
inSpaceBefore(false),
|
|
inSpaceAfter(false),
|
|
outNewLineBefore(false),
|
|
outNewLineAfter(false),
|
|
outSpaceBefore(false),
|
|
outSpaceAfter(false),
|
|
oneLineIfSingleMaxSize(-1),
|
|
single(false),
|
|
singleInNewLine(false),
|
|
singleInSpace(false),
|
|
singleOutNewLine(false),
|
|
singleOutSpace(false) {
|
|
|
|
}
|
|
estyle::BraceProperty::BraceProperty(class estyle::Generator* _generator, const etk::String& _typeName, bool _allowSingle):
|
|
inNewLineBefore(_generator, "brace-" + _typeName + "-in-new-line-before", false, "Set a new line before the input brace"),
|
|
inNewLineAfter(_generator, "brace-" + _typeName + "-in-new-line-after", false, "Set a new line after the input brace"),
|
|
inSpaceBefore(_generator, "brace-" + _typeName + "-in-space-before", false, "Set a space before the input brace (if not already present)"),
|
|
inSpaceAfter(_generator, "brace-" + _typeName + "-in-space-after", false, "Set a space after the input brace (if not already present)"),
|
|
outNewLineBefore(_generator, "brace-" + _typeName + "-out-new-line-before", false, "Set a new line before the input brace"),
|
|
outNewLineAfter(_generator, "brace-" + _typeName + "-out-new-line-after", false, "Set a new line after the input brace"),
|
|
outSpaceBefore(_generator, "brace-" + _typeName + "-out-space-before", false, "Set a space before the input brace (if not already present)"),
|
|
outSpaceAfter(_generator, "brace-" + _typeName + "-out-space-after", false, "Set a space after the input brace (if not already present)"),
|
|
oneLineIfSingleMaxSize((_allowSingle==true?
|
|
etk::move(eproperty::Value<int32_t>(_generator, "brace-" + _typeName + "-single-one-line-size-max", -1, "Set i a single line if the size if < XXX (-1 to disable)")):
|
|
etk::move(eproperty::Value<int32_t>(-1)) )),
|
|
single((_allowSingle==true?
|
|
etk::move(eproperty::Value<bool>(_generator, "brace-" + _typeName + "-single", false, "remove or add brace if only 1 action is present.")):
|
|
etk::move(eproperty::Value<bool>(false)) )),
|
|
singleInNewLine((_allowSingle==true?
|
|
etk::move(eproperty::Value<bool>(_generator, "brace-" + _typeName + "-single-in-new-line", false, "Set new line before action.")):
|
|
etk::move(eproperty::Value<bool>(false)) )),
|
|
singleInSpace((_allowSingle==true?
|
|
etk::move(eproperty::Value<bool>(_generator, "brace-" + _typeName + "-single-in-space", false, "Set Space before action.")):
|
|
etk::move(eproperty::Value<bool>(false)) )),
|
|
singleOutNewLine((_allowSingle==true?
|
|
etk::move(eproperty::Value<bool>(_generator, "brace-" + _typeName + "-single-out-new-line", false, "Set new line after action.")):
|
|
etk::move(eproperty::Value<bool>(false)) )),
|
|
singleOutSpace((_allowSingle==true?
|
|
etk::move(eproperty::Value<bool>(_generator, "brace-" + _typeName + "-single-out-space", false, "Set space after action.")):
|
|
etk::move(eproperty::Value<bool>(false)) )) {
|
|
|
|
}
|
|
|
|
estyle::BraceProperty::BraceProperty(estyle::BraceProperty&& _obj) :
|
|
inNewLineBefore(etk::move(_obj.inNewLineBefore)),
|
|
inNewLineAfter(etk::move(_obj.inNewLineAfter)),
|
|
inSpaceBefore(etk::move(_obj.inSpaceBefore)),
|
|
inSpaceAfter(etk::move(_obj.inSpaceAfter)),
|
|
outNewLineBefore(etk::move(_obj.outNewLineBefore)),
|
|
outNewLineAfter(etk::move(_obj.outNewLineAfter)),
|
|
outSpaceBefore(etk::move(_obj.outSpaceBefore)),
|
|
outSpaceAfter(etk::move(_obj.outSpaceAfter)),
|
|
oneLineIfSingleMaxSize(etk::move(_obj.oneLineIfSingleMaxSize)),
|
|
single(etk::move(_obj.single)),
|
|
singleInNewLine(etk::move(_obj.singleInNewLine)),
|
|
singleInSpace(etk::move(_obj.singleInSpace)),
|
|
singleOutNewLine(etk::move(_obj.singleOutNewLine)),
|
|
singleOutSpace(etk::move(_obj.singleOutSpace)) {
|
|
|
|
}
|
|
|
|
estyle::BraceProperty& estyle::BraceProperty::operator=(BraceProperty&& _obj) {
|
|
inNewLineBefore = etk::move(_obj.inNewLineBefore);
|
|
inNewLineAfter = etk::move(_obj.inNewLineAfter);
|
|
inSpaceBefore = etk::move(_obj.inSpaceBefore);
|
|
inSpaceAfter = etk::move(_obj.inSpaceAfter);
|
|
outNewLineBefore = etk::move(_obj.outNewLineBefore);
|
|
outNewLineAfter = etk::move(_obj.outNewLineAfter);
|
|
outSpaceBefore = etk::move(_obj.outSpaceBefore);
|
|
outSpaceAfter = etk::move(_obj.outSpaceAfter);
|
|
oneLineIfSingleMaxSize = etk::move(_obj.oneLineIfSingleMaxSize);
|
|
single = etk::move(_obj.single);
|
|
singleInNewLine = etk::move(_obj.singleInNewLine);
|
|
singleInSpace = etk::move(_obj.singleInSpace);
|
|
singleOutNewLine = etk::move(_obj.singleOutNewLine);
|
|
singleOutSpace = etk::move(_obj.singleOutSpace);
|
|
return *this;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
estyle::ParentheseProperty::ParentheseProperty() :
|
|
inSpaceBefore(false),
|
|
inSpaceAfter(false),
|
|
outSpaceBefore(false),
|
|
outSpaceAfter(false),
|
|
oneLineMaxSize(20000) {
|
|
|
|
}
|
|
estyle::ParentheseProperty::ParentheseProperty(class estyle::Generator* _generator, const etk::String& _typeName):
|
|
inSpaceBefore(_generator, "parenthese-" + _typeName + "-in-space-before", false, "Set a space before the input parenthese (if not already present)"),
|
|
inSpaceAfter(_generator, "parenthese-" + _typeName + "-in-space-after", false, "Set a space after the input parenthese (if not already present)"),
|
|
outSpaceBefore(_generator, "parenthese-" + _typeName + "-out-space-before", false, "Set a space before the input parenthese (if not already present)"),
|
|
outSpaceAfter(_generator, "parenthese-" + _typeName + "-out-space-after", false, "Set a space after the input parenthese (if not already present)"),
|
|
oneLineMaxSize(_generator, "parenthese-" + _typeName + "-single-one-line-size-max", 20000, "Set in a single line if the size if < XXX (-1 to disable)") {
|
|
|
|
}
|
|
|
|
estyle::ParentheseProperty::ParentheseProperty(estyle::ParentheseProperty&& _obj) :
|
|
inSpaceBefore(etk::move(_obj.inSpaceBefore)),
|
|
inSpaceAfter(etk::move(_obj.inSpaceAfter)),
|
|
outSpaceBefore(etk::move(_obj.outSpaceBefore)),
|
|
outSpaceAfter(etk::move(_obj.outSpaceAfter)),
|
|
oneLineMaxSize(etk::move(_obj.oneLineMaxSize)) {
|
|
|
|
}
|
|
|
|
estyle::ParentheseProperty& estyle::ParentheseProperty::operator=(ParentheseProperty&& _obj) {
|
|
inSpaceBefore = etk::move(_obj.inSpaceBefore);
|
|
inSpaceAfter = etk::move(_obj.inSpaceAfter);
|
|
outSpaceBefore = etk::move(_obj.outSpaceBefore);
|
|
outSpaceAfter = etk::move(_obj.outSpaceAfter);
|
|
oneLineMaxSize = etk::move(_obj.oneLineMaxSize);
|
|
return *this;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
void estyle::Generator::clear() {
|
|
m_offset = 0;
|
|
m_offsetStack.clear();
|
|
m_type = "block";
|
|
m_typeStack.clear();
|
|
//m_lexer;
|
|
m_indentation = 0;
|
|
m_output = "";
|
|
}
|
|
|
|
estyle::Generator::Generator():
|
|
propertyEndOfLine(this, "end-of-line", true, "true: End with \\n, false \\r\\n"),
|
|
propertyIndentWithTabulation(this, "indent-with-tabs", true, "true: indent with tabs: '\\t', false indent win space:' '"),
|
|
propertyIndentSize(this, "indent-size", 4, "default 4 sapce in one tabulation indentation"),
|
|
propertyDoxygenOneLine(this, "doxygen-1-line-type", true, "true: single line doxygen comment is done with '//!', false '///'"),
|
|
propertyDoxygenMultipleLine(this, "doxygen-N-line-type", DOXYGEN_MULTI_LINE__NORMAL, "0: /** */ ..."),
|
|
propertySemiColonReturnBetweenAction(this, "semi-colon-return-between-action", false, "true: 2 action separate with a ';' element have a newLine added")
|
|
{
|
|
setPropertyDoxygenMultiLine(propertyDoxygenMultipleLine);
|
|
propertyBrace.set("if", etk::move(estyle::BraceProperty(this, "if")));
|
|
propertyBrace.set("else", etk::move(estyle::BraceProperty(this, "else")));
|
|
propertyBrace.set("function", etk::move(estyle::BraceProperty(this, "function", false)));
|
|
propertyBrace.set("for", etk::move(estyle::BraceProperty(this, "for")));
|
|
propertyBrace.set("while", etk::move(estyle::BraceProperty(this, "while")));
|
|
propertyBrace.set("namespace", etk::move(estyle::BraceProperty(this, "namespace", false)));
|
|
propertyBrace.set("block", etk::move(estyle::BraceProperty(this, "block", false)));
|
|
|
|
propertyBrace.set("do-while", etk::move(estyle::BraceProperty(this, "do-while")));
|
|
propertyBrace.set("switch", etk::move(estyle::BraceProperty(this, "switch", false)));
|
|
propertyBrace.set("class", etk::move(estyle::BraceProperty(this, "class", false)));
|
|
propertyBrace.set("struct", etk::move(estyle::BraceProperty(this, "struct", false)));
|
|
|
|
propertyParenthese.set("if", etk::move(estyle::ParentheseProperty(this, "if")));
|
|
propertyParenthese.set("for", etk::move(estyle::ParentheseProperty(this, "for")));
|
|
propertyParenthese.set("while", etk::move(estyle::ParentheseProperty(this, "while")));
|
|
propertyParenthese.set("do-while", etk::move(estyle::ParentheseProperty(this, "do-while")));
|
|
propertyParenthese.set("switch", etk::move(estyle::ParentheseProperty(this, "switch")));
|
|
propertyParenthese.set("block", etk::move(estyle::ParentheseProperty(this, "block")));
|
|
|
|
|
|
//ParentheseProperty
|
|
}
|
|
|
|
estyle::Generator::~Generator() {
|
|
|
|
}
|
|
|
|
etk::String estyle::Generator::getEndOfLine() {
|
|
if (propertyEndOfLine.get() == true) {
|
|
return "\n";
|
|
}
|
|
return "\r\n";
|
|
}
|
|
|
|
etk::String estyle::Generator::getDoxygenOneLine() {
|
|
if (propertyDoxygenOneLine.get() == true) {
|
|
return "//!";
|
|
}
|
|
return "///";
|
|
}
|
|
etk::String estyle::Generator::getDoxygenNLine(const etk::String& _data) {
|
|
if (propertyDoxygenMultipleLine.get() == 0) {
|
|
|
|
|
|
}
|
|
etk::String out;
|
|
out += "/**";
|
|
out += _data;
|
|
out += "*/";
|
|
return out;
|
|
}
|
|
|
|
|
|
void estyle::Generator::addNewLine() {
|
|
while ( ( m_output.back() == ' '
|
|
|| m_output.back() == '\t')
|
|
&& m_output.size()>0) {
|
|
m_output.popBack();
|
|
}
|
|
if (m_output.size() == 0) {
|
|
return;
|
|
}
|
|
if (m_output.back() == '\0') {
|
|
ESTYLE_TODO("TODO : Do indentation... : '" << m_output << "'");
|
|
}
|
|
if (m_output.back() == '\n') {
|
|
return;
|
|
}
|
|
m_output += getEndOfLine();
|
|
}
|
|
|
|
void estyle::Generator::addNewLineIfSemiColon() {
|
|
if (m_output.size() == 0) {
|
|
return;
|
|
}
|
|
if ( m_output.back() == ';'
|
|
&& propertySemiColonReturnBetweenAction.get() == true) {
|
|
m_output += getEndOfLine();
|
|
}
|
|
}
|
|
|
|
void estyle::Generator::addIndent() {
|
|
if (m_output.size() == 0) {
|
|
return;
|
|
}
|
|
if (m_output.back() == '\0') {
|
|
ESTYLE_TODO("TODO : Do indentation... : '" << m_output << "'");
|
|
}
|
|
if (m_output.back() == '\n') {
|
|
if (propertyIndentWithTabulation.get() == true) {
|
|
for (int32_t iii=0; iii<m_indentation; ++iii) {
|
|
m_output += "\t";
|
|
}
|
|
} else {
|
|
for (int32_t iii=0; iii<m_indentation; ++iii) {
|
|
for (int32_t jjj=0; jjj<propertyIndentSize.get(); ++jjj) {
|
|
m_output += " ";
|
|
}
|
|
}
|
|
}
|
|
for (int32_t ooo=0; ooo<m_offset; ++ooo) {
|
|
m_output += " ";
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
void estyle::Generator::addSpace(bool _force) {
|
|
if (_force == false) {
|
|
while ( ( m_output.back() == ' '
|
|
|| m_output.back() == '\t')
|
|
&& m_output.size()>0) {
|
|
m_output.popBack();
|
|
}
|
|
}
|
|
if (m_output.size() == 0) {
|
|
return;
|
|
}
|
|
if (m_output.back() == '\0') {
|
|
ESTYLE_TODO("TODO : Do indentation... : '" << m_output << "'");
|
|
}
|
|
if (m_output.back() == '\n') {
|
|
addIndent();
|
|
return;
|
|
}
|
|
if ( m_output.back() == ' '
|
|
|| m_output.back() == '\t') {
|
|
return;
|
|
}
|
|
m_output += " ";
|
|
}
|
|
void estyle::Generator::addSpaceIfNeeded() {
|
|
if (m_output.size() == 0) {
|
|
return;
|
|
}
|
|
if (m_output.back() == '\0') {
|
|
return;
|
|
}
|
|
if (m_output.back() == '\n') {
|
|
return;
|
|
}
|
|
if ( ( m_output.back() >= '0'
|
|
&& m_output.back() <= '9' )
|
|
|| ( m_output.back() >= 'a'
|
|
&& m_output.back() <= 'z' )
|
|
|| ( m_output.back() >= 'A'
|
|
&& m_output.back() <= 'Z' )
|
|
|| m_output.back() == '_' ) {
|
|
m_output += " ";
|
|
}
|
|
}
|
|
|
|
static bool startWithText(const etk::String& _data) {
|
|
if (_data.size() == 0) {
|
|
return false;
|
|
}
|
|
if ( ( _data[0] >= '0'
|
|
&& _data[0] <= '9' )
|
|
|| ( _data[0] >= 'a'
|
|
&& _data[0] <= 'z' )
|
|
|| ( _data[0] >= 'A'
|
|
&& _data[0] <= 'Z' )
|
|
|| _data[0] == '_' ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool estyle::Generator::onNewLine() {
|
|
if (m_output.size() == 0) {
|
|
return true;
|
|
}
|
|
if (m_output.back() == '\n') {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
enum class stack {
|
|
NAMESPACE,
|
|
CLASS,
|
|
STRUCT,
|
|
BLOCK,
|
|
DO,
|
|
WHILE,
|
|
FOR,
|
|
IF,
|
|
ELSE,
|
|
PTHESE_CONDITION,
|
|
PTHESE,
|
|
};
|
|
etk::Vector<enum stack> m_urrentStack;
|
|
|
|
etk::String estyle::Generator::process(const etk::String& _code) {
|
|
clear();
|
|
m_lexer.lexify(_code);
|
|
process(0, m_lexer.size(), estyle::lexer::END_OF_FILE);
|
|
return m_output;
|
|
}
|
|
|
|
int32_t estyle::Generator::process(int32_t _startId,
|
|
int32_t _stopId,
|
|
enum estyle::lexer::tocken _endTocken1,
|
|
enum estyle::lexer::tocken _endTocken2,
|
|
enum estyle::lexer::tocken _endTocken3,
|
|
enum estyle::lexer::tocken _endTocken4) {
|
|
for (int64_t iii = _startId; iii < _stopId; ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if ( elem == _endTocken1
|
|
|| elem == _endTocken2
|
|
|| elem == _endTocken3
|
|
|| elem == _endTocken4) {
|
|
return iii;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_COMMENT_1_LINE) {
|
|
addNewLineIfSemiColon();
|
|
m_output += "//";
|
|
m_output += m_lexer.getData(iii);
|
|
m_output += getEndOfLine();
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_DOCUMENTATION_1_LINE) {
|
|
addNewLineIfSemiColon();
|
|
m_output += getDoxygenOneLine();
|
|
m_output += m_lexer.getData(iii);
|
|
m_output += getEndOfLine();
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_COMMENT_N_LINE) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "/*";
|
|
m_output += m_lexer.getData(iii);
|
|
m_output += "*/";
|
|
if (iii+1 < m_lexer.size()) {
|
|
if (m_lexer.getTocken(iii+1) == estyle::lexer::RESERVED_NEW_LINE) {
|
|
m_output += getEndOfLine();
|
|
++iii;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_DOCUMENTATION_1_LINE) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += getDoxygenNLine(m_lexer.getData(iii));
|
|
m_output += getEndOfLine();
|
|
// TODO : Some mode can create error like /** */ becaming /// ...
|
|
if (iii+1 < m_lexer.size()) {
|
|
if (m_lexer.getTocken(iii+1) == estyle::lexer::RESERVED_NEW_LINE) {
|
|
m_output += getEndOfLine();
|
|
++iii;
|
|
}
|
|
}
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_SIZE_T) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "size_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_008) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "int8_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_008_UNSIGNED) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "uint8_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_016) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "int16_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_016_UNSIGNED) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "uint16_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_032) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "int32_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_032_UNSIGNED) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "uint32_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_064) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "int64_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_064_UNSIGNED) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "uint64_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_128) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "int128_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_INTEGER_128_UNSIGNED) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "uint128_t";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_FLOAT_32) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "float";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_FLOAT_64) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "double";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_FLOAT_96) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "triple";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_BOOLEAN) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "bool";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BASIC_TYPE_VOID) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "void";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::SEMICOLON) {
|
|
addNewLineIfSemiColon();
|
|
m_output += ";";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::ID) {
|
|
addNewLineIfSemiColon();
|
|
//addSpace();
|
|
addIndent();
|
|
m_output += m_lexer.getData(iii);
|
|
continue;
|
|
}
|
|
|
|
if (elem == estyle::lexer::EQUAL) {
|
|
addNewLineIfSemiColon();
|
|
addSpace();
|
|
m_output += "=";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::STRING) {
|
|
addNewLineIfSemiColon();
|
|
m_output += "\"";
|
|
m_output += m_lexer.getData(iii);
|
|
m_output += "\"";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::SIMPLE_QUOTE_STRING) {
|
|
addNewLineIfSemiColon();
|
|
m_output += "'";
|
|
m_output += m_lexer.getData(iii);
|
|
m_output += "'";
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BRACE_IN) {
|
|
typePush("block");
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = endOfSection(iii);
|
|
iii = generateBrace(subGenerationStart, subGenerationStop, true, false);
|
|
iii--;
|
|
typePop();
|
|
/*
|
|
addNewLineIfSemiColon();
|
|
m_urrentStack.pushBack(stack::BLOCK);
|
|
addNewLine();
|
|
addSpace();
|
|
m_output += "{";
|
|
m_output += getEndOfLine();
|
|
indentationPush();
|
|
*/
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::BRACE_OUT) {
|
|
addNewLineIfSemiColon();
|
|
indentationPop();
|
|
ESTYLE_ERROR("Get '}' without other than a '{' element in stack of type ...");
|
|
addNewLine();
|
|
addSpace();
|
|
m_output += "}";
|
|
m_output += getEndOfLine();
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::ELEMENT_COMPLEX_TYPE) {
|
|
addNewLineIfSemiColon();
|
|
// complex type is special to generate...
|
|
etk::String type = generateType(iii);
|
|
addSpace();
|
|
m_output += type;
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_FOR) {
|
|
addNewLineIfSemiColon();
|
|
addIndent();
|
|
addSpaceIfNeeded();
|
|
m_output += "for";
|
|
typePush("for");
|
|
offsetPush(4);
|
|
bool errorOccured = false;
|
|
// TODO : do this ==> not implemented
|
|
for (int64_t jjj=iii+1; jjj<m_lexer.size(); ++jjj) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(jjj);
|
|
if (elem == estyle::lexer::RESERVED_NEW_LINE) {
|
|
// OK ==> normal case ...
|
|
} else if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
// find condition section ...
|
|
int64_t lastElementCondition = endOfSection(jjj);
|
|
// now we need to count the number of actions ... must be 3 inside (A;B;C)
|
|
int32_t nbAction = countCurrentAction(jjj, lastElementCondition);
|
|
if (nbAction != 2) {
|
|
ESTYLE_ERROR("Get not enought action in 'for' " << nbAction << " != 2 (action is ended with a ';' element");
|
|
typePop();
|
|
errorOccured = true;
|
|
break;
|
|
}
|
|
int32_t rawSize = countRawSize(jjj+1, lastElementCondition);
|
|
int64_t endSectionA = endOfAction(jjj);
|
|
int32_t nbElementSectionA = endSectionA - (jjj+1);
|
|
int64_t endSectionB = endOfAction(endSectionA);
|
|
int32_t nbElementSectionB = endSectionB - (endSectionA+1);
|
|
int32_t nbElementSectionC = lastElementCondition - (endSectionB+1);
|
|
if ( nbElementSectionA == 0
|
|
&& nbElementSectionB == 0
|
|
&& nbElementSectionC == 0) {
|
|
m_output += "(;;)";
|
|
} else {
|
|
m_output += "(";
|
|
// write section A
|
|
process(jjj+1, endSectionA);
|
|
m_output += ";";
|
|
ESTYLE_WARNING("big size: " << propertyParenthese[m_type].oneLineMaxSize.get() << " <= " << rawSize);
|
|
if (propertyParenthese[m_type].oneLineMaxSize.get() <= rawSize) {
|
|
addNewLine();
|
|
addIndent();
|
|
} else {
|
|
m_output += " ";
|
|
}
|
|
// write section B
|
|
process(endSectionA+1, endSectionB);
|
|
m_output += ";";
|
|
if (propertyParenthese[m_type].oneLineMaxSize.get() <= rawSize) {
|
|
addNewLine();
|
|
addIndent();
|
|
} else {
|
|
m_output += " ";
|
|
}
|
|
// Write section C
|
|
process(endSectionB+1, lastElementCondition);
|
|
m_output += ")";
|
|
}
|
|
iii = lastElementCondition;
|
|
break;
|
|
} else {
|
|
ESTYLE_ERROR("Get 'for' without '(' element");
|
|
typePop();
|
|
errorOccured = true;
|
|
break;
|
|
}
|
|
}
|
|
if (errorOccured == true) {
|
|
continue;
|
|
}
|
|
offsetPop();
|
|
bool needBrace = false;
|
|
bool haveBrace = false;
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = iii+1;
|
|
// Check if next action is inside {} or not ...
|
|
if (nextIs(iii+1, estyle::lexer::BRACE_IN) == true) {
|
|
haveBrace = true;
|
|
// no need to add one ...
|
|
int32_t countAction = countCurrent(iii+1, m_lexer.size(), estyle::lexer::tocken::SEMICOLON);
|
|
ESTYLE_ERROR("nbAction = " << countAction);
|
|
if (countAction != 1) {
|
|
needBrace = true;
|
|
}
|
|
subGenerationStart = iii+2;
|
|
subGenerationStop = endOfSection(iii+1);
|
|
} else {
|
|
// only 1 instruction:
|
|
int32_t sectionEnd = endOfAction(iii+1);
|
|
subGenerationStop = sectionEnd+1;
|
|
}
|
|
iii = generateBrace(subGenerationStart, subGenerationStop, needBrace, true);
|
|
if (haveBrace == true) {
|
|
iii--;
|
|
} else {
|
|
iii -= 2;
|
|
}
|
|
typePop();
|
|
continue;
|
|
}
|
|
if ( elem == estyle::lexer::RESERVED_IF
|
|
|| elem == estyle::lexer::RESERVED_WHILE
|
|
|| elem == estyle::lexer::RESERVED_DO) {
|
|
addNewLineIfSemiColon();
|
|
addIndent();
|
|
addSpaceIfNeeded();
|
|
if (elem == estyle::lexer::RESERVED_IF) {
|
|
m_output += "if";
|
|
typePush("if");
|
|
if (previousIs(iii, estyle::lexer::RESERVED_ELSE) == true) {
|
|
offsetPush(4 + 5);
|
|
} else {
|
|
offsetPush(4);
|
|
}
|
|
} else if (elem == estyle::lexer::RESERVED_WHILE) {
|
|
m_output += "while";
|
|
typePush("while");
|
|
offsetPush(7);
|
|
} else {
|
|
m_output += "do";
|
|
typePush("do-while");
|
|
}
|
|
bool haveError = false;
|
|
if (elem != estyle::lexer::RESERVED_DO) {
|
|
for (int64_t jjj=iii+1; jjj<m_lexer.size(); ++jjj) {
|
|
enum estyle::lexer::tocken elem2 = m_lexer.getTocken(jjj);
|
|
if (elem2 == estyle::lexer::RESERVED_NEW_LINE) {
|
|
// OK ==> normal case ...
|
|
} else if (elem2 == estyle::lexer::PARENTHESE_IN) {
|
|
// find condition section ...
|
|
iii = generateCondition(jjj);
|
|
break;
|
|
} else {
|
|
ESTYLE_ERROR("Get '" << elem << "' without '(' element");
|
|
haveError = true;
|
|
break;
|
|
}
|
|
}
|
|
offsetPop();
|
|
if (haveError == true) {
|
|
typePop();
|
|
continue;
|
|
}
|
|
}
|
|
bool needBrace = false;
|
|
bool haveBrace = false;
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = iii+1;
|
|
// Check if next action is inside {} or not ...
|
|
if (nextIs(iii+1, estyle::lexer::BRACE_IN) == true) {
|
|
haveBrace = true;
|
|
// no need to add one ...
|
|
int32_t countAction = countCurrent(iii+1, m_lexer.size(), estyle::lexer::tocken::SEMICOLON);
|
|
if (countAction != 1) {
|
|
needBrace = true;
|
|
}
|
|
subGenerationStart = iii+2;
|
|
subGenerationStop = endOfSection(iii+1);
|
|
} else {
|
|
// only 1 instruction:
|
|
int32_t sectionEnd = endOfAction(iii+1);
|
|
subGenerationStop = sectionEnd+1;
|
|
}
|
|
iii = generateBrace(subGenerationStart,
|
|
subGenerationStop,
|
|
needBrace,
|
|
elem == estyle::lexer::RESERVED_IF);
|
|
if (haveBrace == true) {
|
|
iii--;
|
|
} else {
|
|
iii -= 2;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_DO) {
|
|
if (nextIs(iii+1, estyle::lexer::RESERVED_WHILE) == false) {
|
|
ESTYLE_ERROR("find a 'do ... ' without 'while' ...");
|
|
typePop();
|
|
continue;
|
|
} else {
|
|
addSpaceIfNeeded();
|
|
iii++;
|
|
m_output += "while";
|
|
offsetPush(6);
|
|
for (int64_t jjj=iii+1; jjj<m_lexer.size(); ++jjj) {
|
|
enum estyle::lexer::tocken elem2 = m_lexer.getTocken(jjj);
|
|
if (elem2 == estyle::lexer::RESERVED_NEW_LINE) {
|
|
// OK ==> normal case ...
|
|
} else if (elem2 == estyle::lexer::PARENTHESE_IN) {
|
|
// find condition section ...
|
|
iii = generateCondition(jjj);
|
|
break;
|
|
} else {
|
|
ESTYLE_ERROR("Get 'do ... while ' without '(' element");
|
|
haveError = true;
|
|
break;
|
|
}
|
|
}
|
|
offsetPop();
|
|
if (haveError == true) {
|
|
typePop();
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
typePop();
|
|
continue;
|
|
}
|
|
if (elem == estyle::lexer::RESERVED_ELSE) {
|
|
addNewLineIfSemiColon();
|
|
typePush("else");
|
|
addSpaceIfNeeded();
|
|
m_output += "else";
|
|
// special case ==> nothing special to do for the else element...
|
|
if (nextIs(iii+1, estyle::lexer::RESERVED_IF) == true) {
|
|
typePop();
|
|
continue;
|
|
}
|
|
bool needBrace = false;
|
|
bool haveBrace = false;
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = iii+1;
|
|
if (nextIs(iii+1, estyle::lexer::BRACE_IN) == true) {
|
|
haveBrace = true;
|
|
int32_t countAction = countCurrent(iii+1, m_lexer.size(), estyle::lexer::tocken::SEMICOLON);
|
|
if (countAction != 1) {
|
|
needBrace = true;
|
|
}
|
|
subGenerationStart = iii+2;
|
|
subGenerationStop = endOfSection(iii+1);
|
|
} else {
|
|
// only 1 instruction:
|
|
int32_t sectionEnd = endOfAction(iii+1);
|
|
subGenerationStop = sectionEnd+1;
|
|
}
|
|
iii = generateBrace(subGenerationStart, subGenerationStop, needBrace, true);
|
|
if (haveBrace == true) {
|
|
iii--;
|
|
} else {
|
|
iii -= 2;
|
|
}
|
|
typePop();
|
|
continue;
|
|
}
|
|
if ( elem == estyle::lexer::RESERVED_NAMESPACE
|
|
|| elem == estyle::lexer::RESERVED_CLASS
|
|
|| elem == estyle::lexer::RESERVED_STRUCT) {
|
|
addNewLineIfSemiColon();
|
|
addSpaceIfNeeded();
|
|
if (elem == estyle::lexer::RESERVED_NAMESPACE) {
|
|
typePush("namespace");
|
|
m_output += "namespace";
|
|
} else if (elem == estyle::lexer::RESERVED_CLASS) {
|
|
typePush("class");
|
|
m_output += "class";
|
|
} else if (elem == estyle::lexer::RESERVED_STRUCT) {
|
|
typePush("struct");
|
|
m_output += "struct";
|
|
} else {
|
|
if (startWithText(m_lexer.getData(iii)) == true) {
|
|
addSpaceIfNeeded();
|
|
}
|
|
m_output += m_lexer.getData(iii);
|
|
continue;
|
|
}
|
|
|
|
// special case ==> nothing special to do for the else element...
|
|
if (nextIs(iii+1, estyle::lexer::BRACE_IN) == false) {
|
|
if (nextIs(iii+1, estyle::lexer::ID) == true) {
|
|
// normal case ==> empty namespace / struct / class
|
|
addSpaceIfNeeded();
|
|
iii++;
|
|
m_output += m_lexer.getData(iii);
|
|
} else {
|
|
ESTYLE_ERROR("mamespace must be followed by an ID or a brace");
|
|
typePop();
|
|
continue;
|
|
}
|
|
}
|
|
bool needBrace = false;
|
|
bool haveBrace = false;
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = iii+1;
|
|
if (nextIs(iii+1, estyle::lexer::BRACE_IN) == true) {
|
|
haveBrace = true;
|
|
int32_t countAction = countCurrent(iii+1, m_lexer.size(), estyle::lexer::tocken::SEMICOLON);
|
|
if (countAction != 1) {
|
|
needBrace = true;
|
|
}
|
|
subGenerationStart = iii+2;
|
|
subGenerationStop = endOfSection(iii+1);
|
|
} else {
|
|
ESTYLE_ERROR("Missing { in " << elem);
|
|
typePop();
|
|
continue;
|
|
}
|
|
iii = generateBrace(subGenerationStart, subGenerationStop, needBrace, true);
|
|
if (haveBrace == true) {
|
|
iii--;
|
|
} else {
|
|
iii -= 2;
|
|
}
|
|
typePop();
|
|
continue;
|
|
}
|
|
if ( elem == estyle::lexer::ELEMENT_FUNCTION
|
|
|| elem == estyle::lexer::ELEMENT_FUNCTION_DECLARATION) {
|
|
addNewLineIfSemiColon();
|
|
addSpaceIfNeeded();
|
|
typePush("function");
|
|
//addSpace();
|
|
m_output += m_lexer.getData(iii);
|
|
//offsetPush(m_lexer.getData(iii).size() + 2);
|
|
offsetPushAuto();
|
|
for (int64_t jjj=iii+1; jjj<m_lexer.size(); ++jjj) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(jjj);
|
|
if (elem == estyle::lexer::RESERVED_NEW_LINE) {
|
|
// OK ==> normal case ...
|
|
} else if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
// find condition section ...
|
|
iii = generateFunction(jjj);
|
|
break;
|
|
} else {
|
|
ESTYLE_ERROR("Get '" << m_lexer.getData(iii) << "' (function) without '(' element");
|
|
}
|
|
}
|
|
offsetPop();
|
|
if (elem == estyle::lexer::ELEMENT_FUNCTION_DECLARATION) {
|
|
// nothing more to do ... end of declaration
|
|
continue;
|
|
}
|
|
int32_t subGenerationStart = iii+1;
|
|
int32_t subGenerationStop = iii+1;
|
|
subGenerationStart = iii+2;
|
|
subGenerationStop = endOfSection(iii+1);
|
|
iii = generateBrace(subGenerationStart, subGenerationStop, true);
|
|
//iii--;
|
|
typePop();
|
|
}
|
|
// default other case:
|
|
//addSpace();
|
|
if (startWithText(m_lexer.getData(iii)) == true) {
|
|
addSpaceIfNeeded();
|
|
}
|
|
m_output += m_lexer.getData(iii);
|
|
}
|
|
return _stopId+1;
|
|
}
|
|
|
|
|
|
int64_t estyle::Generator::generateBrace(int64_t _start, int64_t _stop, bool _needBrace, bool _checkElse) {
|
|
/*
|
|
ESTYLE_ERROR(" single " << propertyBrace[m_type].single.get());
|
|
ESTYLE_ERROR(" inNewLineBefore " << propertyBrace[m_type].inNewLineBefore.get());
|
|
ESTYLE_ERROR(" inSpaceBefore " << propertyBrace[m_type].inSpaceBefore.get());
|
|
ESTYLE_ERROR(" inSpaceAfter " << propertyBrace[m_type].inSpaceAfter.get());
|
|
ESTYLE_ERROR(" inNewLineAfter " << propertyBrace[m_type].inNewLineAfter.get());
|
|
ESTYLE_ERROR(" outNewLineBefore " << propertyBrace[m_type].outNewLineBefore.get());
|
|
ESTYLE_ERROR(" outSpaceBefore " << propertyBrace[m_type].outSpaceBefore.get());
|
|
ESTYLE_ERROR(" outSpaceAfter " << propertyBrace[m_type].outSpaceAfter.get());
|
|
ESTYLE_ERROR(" outNewLineAfter " << propertyBrace[m_type].outNewLineAfter.get());
|
|
*/
|
|
int32_t rawSize = countRawSize(_start, _stop);
|
|
bool removeNewLine = propertyBrace[m_type].oneLineIfSingleMaxSize.get() >= rawSize;
|
|
ESTYLE_ERROR("check: " << propertyBrace[m_type].oneLineIfSingleMaxSize.get() << " >= " << rawSize);
|
|
if (_needBrace == false) {
|
|
if (propertyBrace[m_type].single.get() == false) {
|
|
_needBrace = true;
|
|
}
|
|
}
|
|
if (_needBrace == true) {
|
|
if ( propertyBrace[m_type].inNewLineBefore.get() == true
|
|
&& removeNewLine == false) {
|
|
addNewLine();
|
|
// add indentation
|
|
addSpace();
|
|
} else if (propertyBrace[m_type].inSpaceBefore.get() == true) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
}
|
|
m_output += "{";
|
|
if ( propertyBrace[m_type].inNewLineAfter.get() == true
|
|
&& removeNewLine == false) {
|
|
addNewLine();
|
|
} else if (propertyBrace[m_type].inSpaceAfter.get() == true) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
}
|
|
} else {
|
|
if ( propertyBrace[m_type].singleInNewLine.get() == true
|
|
&& removeNewLine == false) {
|
|
addNewLine();
|
|
} else if (propertyBrace[m_type].singleInSpace.get() == true) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
} else {
|
|
addSpaceIfNeeded();
|
|
}
|
|
}
|
|
indentationPush();
|
|
// TODO: maybe check the last element
|
|
int64_t out = process(_start, _stop);
|
|
|
|
indentationPop();
|
|
if (_needBrace == true) {
|
|
if ( propertyBrace[m_type].outNewLineBefore.get() == true
|
|
&& removeNewLine == false) {
|
|
addNewLine();
|
|
// add indentation
|
|
addSpace();
|
|
} else if (propertyBrace[m_type].outSpaceBefore.get() == true) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
}
|
|
m_output += "}";
|
|
if ( propertyBrace[m_type].outSpaceAfter.get() == true
|
|
&& propertyBrace[m_type].outNewLineAfter.get() == false) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
}
|
|
// special case for a else after a condition ...
|
|
if (_checkElse == true) {
|
|
if (nextIs(_stop, estyle::lexer::RESERVED_ELSE) == false) {
|
|
if (propertyBrace[m_type].outNewLineAfter.get() == true) {
|
|
addNewLine();
|
|
}
|
|
}
|
|
} else {
|
|
if (propertyBrace[m_type].outNewLineAfter.get() == true) {
|
|
addNewLine();
|
|
}
|
|
}
|
|
} else {
|
|
if (propertyBrace[m_type].singleOutSpace.get() == true) {
|
|
// add 1 space if needed
|
|
addSpace();
|
|
}
|
|
// special case for a else after a condition ...
|
|
if (_checkElse == true) {
|
|
if (nextIs(_stop, estyle::lexer::RESERVED_ELSE) == false) {
|
|
if (propertyBrace[m_type].singleOutNewLine.get() == true) {
|
|
addNewLine();
|
|
}
|
|
}
|
|
} else {
|
|
if (propertyBrace[m_type].singleOutNewLine.get() == true) {
|
|
addNewLine();
|
|
}
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
|
|
// go ackward and find if previous is the corect type (remove) \n and empty space ==> not comment they need to add it (wrong place but not may job ...
|
|
bool estyle::Generator::previousIs(int64_t _pos, enum estyle::lexer::tocken _previousType) {
|
|
for (int32_t iii=_pos-1; iii>0; --iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if (elem == estyle::lexer::RESERVED_NEW_LINE) {
|
|
continue;
|
|
}
|
|
return elem == _previousType;
|
|
}
|
|
return false;
|
|
}
|
|
bool estyle::Generator::nextIs(int64_t _pos, enum estyle::lexer::tocken _nextType) {
|
|
for (int32_t iii=_pos; iii<m_lexer.size(); ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
ESTYLE_VERBOSE("check if next: " << _nextType << " on " << elem);
|
|
if (elem == estyle::lexer::RESERVED_NEW_LINE) {
|
|
continue;
|
|
}
|
|
return elem == _nextType;
|
|
}
|
|
return false;
|
|
}
|
|
/*
|
|
eproperty::Value<bool> inSpaceBefore;
|
|
eproperty::Value<bool> inSpaceAfter;
|
|
eproperty::Value<bool> outSpaceBefore;
|
|
eproperty::Value<bool> outSpaceAfter;
|
|
eproperty::Value<int32_t> oneLineMaxSize;
|
|
*/
|
|
int64_t estyle::Generator::generateCondition(int64_t _pos) {
|
|
int32_t sectionEnd = endOfSection(_pos);
|
|
|
|
int32_t rawSize = countRawSize(_pos, sectionEnd);
|
|
bool onOneLine = propertyParenthese[m_type].oneLineMaxSize.get() >= rawSize;
|
|
|
|
if (propertyParenthese[m_type].inSpaceBefore.get() == true) {
|
|
addSpace();
|
|
}
|
|
m_output += "(";
|
|
if (propertyParenthese[m_type].inSpaceAfter.get() == true) {
|
|
addSpace();
|
|
}
|
|
|
|
|
|
int32_t nbCondition = countCurrentLevelCondition(_pos);
|
|
if ( nbCondition == 0
|
|
|| onOneLine == true) {
|
|
ESTYLE_WARNING("==> only one element");
|
|
process(_pos+1, sectionEnd);
|
|
} else {
|
|
m_output += " ";
|
|
offsetPushAuto();
|
|
for (int64_t iii=_pos+1; iii<=sectionEnd; ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
iii = generateCondition(iii);
|
|
} else if ( elem == estyle::lexer::AND_AND
|
|
|| elem == estyle::lexer::OR_OR) {
|
|
addNewLine();
|
|
offsetPop();
|
|
addSpace();
|
|
offsetPush(5);
|
|
m_output += " " + m_lexer.getData(iii) + " ";
|
|
} else {
|
|
iii = process(iii, sectionEnd, estyle::lexer::AND_AND, estyle::lexer::OR_OR, estyle::lexer::PARENTHESE_IN, estyle::lexer::PARENTHESE_OUT);
|
|
iii--;
|
|
}
|
|
}
|
|
offsetPop();
|
|
}
|
|
if (propertyParenthese[m_type].outSpaceBefore.get() == true) {
|
|
addSpace();
|
|
}
|
|
m_output += ")";
|
|
if (propertyParenthese[m_type].outSpaceAfter.get() == true) {
|
|
addSpace();
|
|
}
|
|
return sectionEnd;
|
|
}
|
|
|
|
int64_t estyle::Generator::generateFunction(int64_t _pos) {
|
|
int32_t sectionEnd = endOfSection(_pos);
|
|
int32_t nbParameters = countCurrentParameters(_pos);
|
|
m_output += "(";
|
|
offsetPushAuto();
|
|
if (nbParameters == 0) {
|
|
process(_pos + 1, sectionEnd);
|
|
} else {
|
|
for (int64_t iii=_pos+1; iii<=sectionEnd; ++iii) {
|
|
iii = process(iii, sectionEnd, estyle::lexer::COMA, estyle::lexer::PARENTHESE_OUT);
|
|
if (nextIs(iii-1, estyle::lexer::PARENTHESE_OUT) == false) {
|
|
m_output += ",";
|
|
addNewLine();
|
|
addSpace();
|
|
}
|
|
}
|
|
}
|
|
//addSpace();
|
|
m_output += ")";
|
|
offsetPop();
|
|
return sectionEnd;
|
|
}
|
|
|
|
int64_t estyle::Generator::endOfSection(int64_t _pos) {
|
|
ESTYLE_VERBOSE(" " << m_lexer.getTocken(_pos) << " " << _pos << " [BEGIN]");
|
|
enum estyle::lexer::tocken endTocken = estyle::lexer::END_OF_FILE;
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(_pos);
|
|
if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
endTocken = estyle::lexer::PARENTHESE_OUT;
|
|
} else if (elem == estyle::lexer::BRACKET_IN) {
|
|
endTocken = estyle::lexer::BRACKET_OUT;
|
|
} else if (elem == estyle::lexer::BRACE_IN) {
|
|
endTocken = estyle::lexer::BRACE_OUT;
|
|
} else {
|
|
ESTYLE_ERROR("can not get end position of " << m_lexer.getTocken(_pos));
|
|
return _pos;
|
|
}
|
|
for (int64_t iii=_pos+1; iii < m_lexer.size(); ++iii) {
|
|
elem = m_lexer.getTocken(iii);
|
|
if (elem == endTocken) {
|
|
return iii;
|
|
}
|
|
if ( elem == estyle::lexer::PARENTHESE_IN
|
|
|| elem == estyle::lexer::BRACKET_IN
|
|
|| elem == estyle::lexer::BRACE_IN) {
|
|
iii = endOfSection(iii);
|
|
}
|
|
}
|
|
return m_lexer.size();
|
|
}
|
|
int64_t estyle::Generator::endOfAction(int64_t _pos) {
|
|
ESTYLE_VERBOSE(" " << m_lexer.getTocken(_pos) << " " << _pos << " [BEGIN]");
|
|
for (int64_t iii=_pos+1; iii < m_lexer.size(); ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if (elem == estyle::lexer::SEMICOLON) {
|
|
return iii;
|
|
}
|
|
if ( elem == estyle::lexer::PARENTHESE_IN
|
|
|| elem == estyle::lexer::BRACKET_IN
|
|
|| elem == estyle::lexer::BRACE_IN) {
|
|
iii = endOfSection(iii);
|
|
return iii;
|
|
}
|
|
}
|
|
return m_lexer.size();
|
|
}
|
|
|
|
|
|
int32_t estyle::Generator::countCurrent(int64_t _pos,
|
|
int64_t _posEnd,
|
|
enum estyle::lexer::tocken _type1,
|
|
enum estyle::lexer::tocken _type2,
|
|
enum estyle::lexer::tocken _type3,
|
|
enum estyle::lexer::tocken _type4) {
|
|
int32_t out = 0;
|
|
enum estyle::lexer::tocken endTocken = estyle::lexer::END_OF_FILE;
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(_pos);
|
|
if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
endTocken = estyle::lexer::PARENTHESE_OUT;
|
|
} else if (elem == estyle::lexer::BRACKET_IN) {
|
|
endTocken = estyle::lexer::BRACKET_OUT;
|
|
} else if (elem == estyle::lexer::BRACE_IN) {
|
|
endTocken = estyle::lexer::BRACE_OUT;
|
|
} else {
|
|
ESTYLE_ERROR("can not get end position of " << m_lexer.getTocken(_pos));
|
|
return _pos;
|
|
}
|
|
int64_t lastStart = _pos+1;
|
|
int64_t iii;
|
|
for (iii=_pos+1; iii < _posEnd; ++iii) {
|
|
elem = m_lexer.getTocken(iii);
|
|
if (elem == endTocken) {
|
|
/*
|
|
ESTYLE_ERROR("end tocke detected : " << iii << " > " << (lastStart+1) );
|
|
if (iii > lastStart+1) {
|
|
out++;
|
|
}
|
|
*/
|
|
return out;
|
|
}
|
|
if ( elem == estyle::lexer::PARENTHESE_IN
|
|
|| elem == estyle::lexer::BRACKET_IN
|
|
|| elem == estyle::lexer::BRACE_IN) {
|
|
iii = endOfSection(iii);
|
|
}
|
|
if ( _type1 == elem
|
|
|| _type2 == elem
|
|
|| _type3 == elem
|
|
|| _type4 == elem) {
|
|
out++;
|
|
ESTYLE_ERROR("detect type : " << iii);
|
|
lastStart = iii;
|
|
}
|
|
}
|
|
/*
|
|
if (iii == lastStart+1) {
|
|
out++;
|
|
}
|
|
*/
|
|
return out;
|
|
}
|
|
|
|
int32_t estyle::Generator::countCurrentLevelCondition(int64_t _pos) {
|
|
return countCurrent(_pos,
|
|
m_lexer.size(),
|
|
estyle::lexer::AND_AND,
|
|
estyle::lexer::OR_OR);
|
|
}
|
|
|
|
int32_t estyle::Generator::countCurrentParameters(int64_t _pos) {
|
|
return countCurrent(_pos,
|
|
m_lexer.size(),
|
|
estyle::lexer::COMA);
|
|
}
|
|
|
|
int32_t estyle::Generator::countCurrentAction(int64_t _pos) {
|
|
return countCurrent(_pos,
|
|
m_lexer.size(),
|
|
estyle::lexer::SEMICOLON);
|
|
}
|
|
|
|
int32_t estyle::Generator::countCurrentAction(int64_t _pos, int64_t _posEnd) {
|
|
return countCurrent(_pos,
|
|
_posEnd,
|
|
estyle::lexer::SEMICOLON);
|
|
}
|
|
|
|
|
|
int32_t estyle::Generator::countCurrentLevelComa(int64_t _pos) {
|
|
int32_t out = 0;
|
|
enum estyle::lexer::tocken endTocken = estyle::lexer::END_OF_FILE;
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(_pos);
|
|
if (elem == estyle::lexer::PARENTHESE_IN) {
|
|
endTocken = estyle::lexer::PARENTHESE_OUT;
|
|
} else if (elem == estyle::lexer::BRACKET_IN) {
|
|
endTocken = estyle::lexer::BRACKET_OUT;
|
|
} else if (elem == estyle::lexer::BRACE_IN) {
|
|
endTocken = estyle::lexer::BRACE_OUT;
|
|
} else {
|
|
ESTYLE_ERROR("can not get end position of " << m_lexer.getTocken(_pos));
|
|
return _pos;
|
|
}
|
|
for (int64_t iii=_pos+1; iii < m_lexer.size(); ++iii) {
|
|
elem = m_lexer.getTocken(iii);
|
|
if (elem == endTocken) {
|
|
return out;
|
|
}
|
|
if ( elem == estyle::lexer::PARENTHESE_IN
|
|
|| elem == estyle::lexer::BRACKET_IN
|
|
|| elem == estyle::lexer::BRACE_IN) {
|
|
iii = endOfSection(iii);
|
|
}
|
|
if (elem == estyle::lexer::COMA) {
|
|
out++;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
|
|
int32_t estyle::Generator::getWhileCondition(int64_t _pos) {
|
|
enum estyle::lexer::tocken endTocken = estyle::lexer::PARENTHESE_OUT;
|
|
for (int64_t iii=_pos; iii < m_lexer.size(); ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if (elem == endTocken) {
|
|
return iii;
|
|
}
|
|
if ( elem == estyle::lexer::PARENTHESE_IN
|
|
|| elem == estyle::lexer::BRACKET_IN
|
|
|| elem == estyle::lexer::BRACE_IN) {
|
|
iii = endOfSection(iii);
|
|
}
|
|
if ( elem == estyle::lexer::AND_AND
|
|
|| elem == estyle::lexer::OR_OR) {
|
|
return iii;
|
|
}
|
|
}
|
|
return m_lexer.size();
|
|
}
|
|
|
|
etk::String estyle::Generator::generateType(int64_t _pos) {
|
|
etk::String out;
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(_pos);
|
|
if (elem == estyle::lexer::ELEMENT_COMPLEX_TYPE) {
|
|
etk::Vector<estyle::LexerElement> listElement = m_lexer.getSubList(_pos);
|
|
for (size_t iii=0; iii<listElement.size(); ++iii) {
|
|
enum estyle::lexer::tocken elem2 = listElement[iii].getTocken();
|
|
if (elem2 == estyle::lexer::RESERVED_NEW_LINE) {
|
|
continue;
|
|
}
|
|
if (iii != 0) {
|
|
out += " ";
|
|
}
|
|
out += m_lexer.getDataSource(listElement[iii].getStart(), listElement[iii].getStop());
|
|
}
|
|
} else {
|
|
out = m_lexer.getData(_pos);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
int32_t estyle::Generator::countRawSize(int64_t _pos, int64_t _posEnd) {
|
|
int32_t out = 0;
|
|
for (int64_t iii=_pos; iii<_posEnd; ++iii) {
|
|
enum estyle::lexer::tocken elem = m_lexer.getTocken(iii);
|
|
if (elem == estyle::lexer::ELEMENT_COMPLEX_TYPE) {
|
|
etk::Vector<estyle::LexerElement> listElement = m_lexer.getSubList(_pos);
|
|
for (size_t jjj=0; jjj<listElement.size(); ++jjj) {
|
|
enum estyle::lexer::tocken elem2 = listElement[jjj].getTocken();
|
|
if (elem2 == estyle::lexer::RESERVED_NEW_LINE) {
|
|
continue;
|
|
}
|
|
out += (listElement[jjj].getStop() - listElement[jjj].getStart());
|
|
}
|
|
} else {
|
|
ESTYLE_WARNING("add Size : '" << m_lexer.getData(iii) << "' " << out << " +=" << m_lexer.getData(iii).size());
|
|
out += m_lexer.getData(iii).size();
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|