add format and logger

This commit is contained in:
ridethepig 2023-05-01 23:52:06 +08:00
parent 5c492ddbf4
commit 32e3dc7a77
6 changed files with 8899 additions and 20 deletions

137
.clang-format Normal file
View File

@ -0,0 +1,137 @@
---
Language: Cpp
BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
SortPriority: 0
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
SortPriority: 0
- Regex: '.*'
Priority: 1
SortPriority: 0
IncludeIsMainRegex: '(Test)?$'
IncludeIsMainSourceRegex: ''
IndentCaseLabels: false
IndentGotoLabels: true
IndentPPDirectives: None
IndentWidth: 2
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInConditionalStatement: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
Standard: Latest
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 8
UseCRLF: false
UseTab: Never
...

View File

@ -12,7 +12,16 @@ include_directories(${ANTLR4_INCLUDE_DIR})
# Custom sources start here
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/antlrgen)
file(GLOB_RECURSE SOURCES "src/*.cpp")
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.cc")
file(GLOB_RECURSE HEADERS "include/*.hpp" "include/*.h" "include/*.hh")
file(GLOB MY_SOURCES "src/*.cpp")
file(GLOB MY_HEADERS "include/*.h")
include(formatting.cmake)
clang_format(format ${MY_SOURCES} ${MY_HEADERS})
clang_format_check(format_check ${MY_SOURCES} ${MY_HEADERS})
add_executable(sysy ${SOURCES})
# message(STATUS "${SOURCES}")
target_link_libraries(sysy antlr4_static)

174
formatting.cmake Normal file
View File

@ -0,0 +1,174 @@
#
# Copyright (C) 2019 by George Cave - gcave@stablecoder.ca
#
# 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.
#
# clang-format
#
find_program(CLANG_FORMAT_EXE "clang-format")
mark_as_advanced(FORCE CLANG_FORMAT_EXE)
if(CLANG_FORMAT_EXE)
message(STATUS "clang-format found: ${CLANG_FORMAT_EXE}")
else()
message(STATUS "clang-format not found!")
endif()
# Generates a 'format' target using a custom name, files, and include
# directories all being parameters.
#
# Do note that in order for sources to be inherited properly, the source paths
# must be reachable from where the macro is called, or otherwise require a full
# path for proper inheritance.
#
# ~~~
# Required:
# TARGET_NAME - The name of the target to create.
#
# Optional: ARGN - The list of targets OR files to format. Relative and absolute
# paths are accepted.
# ~~~
function(clang_format TARGET_NAME)
if(CLANG_FORMAT_EXE)
set(FORMAT_FILES)
# Check through the ARGN's, determine existent files
foreach(item IN LISTS ARGN)
if(TARGET ${item})
# If the item is a target, then we'll attempt to grab the associated
# source files from it.
get_target_property(_TARGET_TYPE ${item} TYPE)
if(NOT _TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
get_property(
_TEMP
TARGET ${item}
PROPERTY SOURCES)
foreach(iter IN LISTS _TEMP)
if(EXISTS ${iter})
set(FORMAT_FILES ${FORMAT_FILES} ${iter})
endif()
endforeach()
endif()
elseif(EXISTS ${item})
# Check if it's a full file path
set(FORMAT_FILES ${FORMAT_FILES} ${item})
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${item})
# Check if it's based on the current source dir
set(FORMAT_FILES ${FORMAT_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/${item})
endif()
endforeach()
# Make the target
if(FORMAT_FILES)
add_custom_target(${TARGET_NAME} COMMAND ${CLANG_FORMAT_EXE} -i
-style=file ${FORMAT_FILES})
if(NOT TARGET format)
add_custom_target(format)
endif()
add_dependencies(format ${TARGET_NAME})
endif()
endif()
endfunction()
function(clang_format_check TARGET_NAME)
if(CLANG_FORMAT_EXE)
set(FORMAT_FILES)
# Check through the ARGN's, determine existent files
foreach(item IN LISTS ARGN)
if(TARGET ${item})
# If the item is a target, then we'll attempt to grab the associated
# source files from it.
get_target_property(_TARGET_TYPE ${item} TYPE)
if(NOT _TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
get_property(
_TEMP
TARGET ${item}
PROPERTY SOURCES)
foreach(iter IN LISTS _TEMP)
if(EXISTS ${iter})
set(FORMAT_FILES ${FORMAT_FILES} ${iter})
endif()
endforeach()
endif()
elseif(EXISTS ${item})
# Check if it's a full file path
set(FORMAT_FILES ${FORMAT_FILES} ${item})
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${item})
# Check if it's based on the current source dir
set(FORMAT_FILES ${FORMAT_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/${item})
endif()
endforeach()
# Make the target
if(FORMAT_FILES)
add_custom_target(${TARGET_NAME} COMMAND ${CLANG_FORMAT_EXE} -n -Werror
-style=file ${FORMAT_FILES})
endif()
endif()
endfunction()
#
# cmake-format
#
find_program(CMAKE_FORMAT_EXE "cmake-format")
mark_as_advanced(FORCE CMAKE_FORMAT_EXE)
if(CMAKE_FORMAT_EXE)
message(STATUS "cmake-format found: ${CMAKE_FORMAT_EXE}")
else()
message(STATUS "cmake-format not found!")
endif()
# When called, this function will call 'cmake-format' program on all listed
# files (if both the program and the files exist and are found)
# ~~~
# Required:
# TARGET_NAME - The name of the target to create.
#
# Optional:
# ARGN - Any arguments passed in will be considered as 'files' to perform the
# formatting on. Any items that are not files will be ignored. Both relative and
# absolute paths are accepted.
# ~~~
function(cmake_format TARGET_NAME)
if(CMAKE_FORMAT_EXE)
set(FORMAT_FILES)
# Determine files that exist
foreach(iter IN LISTS ARGN)
if(EXISTS ${iter})
set(FORMAT_FILES ${FORMAT_FILES} ${iter})
elseif(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${iter})
set(FORMAT_FILES ${FORMAT_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/${iter})
endif()
endforeach()
# Generate target
if(FORMAT_FILES)
if(TARGET ${TARGET_NAME})
message(
ERROR
"Cannot create cmake-format target '${TARGET_NAME}', already exists.")
else()
add_custom_target(${TARGET_NAME} COMMAND ${CMAKE_FORMAT_EXE} -i
${FORMAT_FILES})
if(NOT TARGET cmake-format)
add_custom_target(cmake-format)
endif()
add_dependencies(cmake-format ${TARGET_NAME})
endif()
endif()
endif()
endfunction()

View File

@ -506,10 +506,12 @@ public:
m_num_args_range = NArgsRange{0, 1};
break;
case nargs_pattern::any:
m_num_args_range = NArgsRange{0, (std::numeric_limits<std::size_t>::max)()};
m_num_args_range =
NArgsRange{0, (std::numeric_limits<std::size_t>::max)()};
break;
case nargs_pattern::at_least_one:
m_num_args_range = NArgsRange{1, (std::numeric_limits<std::size_t>::max)()};
m_num_args_range =
NArgsRange{1, (std::numeric_limits<std::size_t>::max)()};
break;
}
return *this;
@ -706,8 +708,7 @@ public:
using ValueType = typename T::value_type;
auto lhs = get<T>();
return std::equal(std::begin(lhs), std::end(lhs), std::begin(rhs),
std::end(rhs),
[](const auto &a, const auto &b) {
std::end(rhs), [](const auto &a, const auto &b) {
return std::any_cast<const ValueType &>(a) == b;
});
}
@ -1120,16 +1121,11 @@ public:
}
explicit operator bool() const {
auto arg_used = std::any_of(m_argument_map.cbegin(),
m_argument_map.cend(),
[](auto &it) {
return it.second->m_is_used;
});
auto subparser_used = std::any_of(m_subparser_used.cbegin(),
m_subparser_used.cend(),
[](auto &it) {
return it.second;
});
auto arg_used = std::any_of(m_argument_map.cbegin(), m_argument_map.cend(),
[](auto &it) { return it.second->m_is_used; });
auto subparser_used =
std::any_of(m_subparser_used.cbegin(), m_subparser_used.cend(),
[](auto &it) { return it.second; });
return m_is_parsed && (arg_used || subparser_used);
}
@ -1183,8 +1179,7 @@ public:
/* Getter for arguments and subparsers.
* @throws std::logic_error in case of an invalid argument or subparser name
*/
template <typename T = Argument>
T& at(std::string_view name) {
template <typename T = Argument> T &at(std::string_view name) {
if constexpr (std::is_same_v<T, Argument>) {
return (*this)[name];
} else {
@ -1660,7 +1655,8 @@ private:
}
std::size_t max_size = 0;
for ([[maybe_unused]] const auto &[unused, argument] : m_argument_map) {
max_size = std::max<std::size_t>(max_size, argument->get_arguments_length());
max_size =
std::max<std::size_t>(max_size, argument->get_arguments_length());
}
for ([[maybe_unused]] const auto &[command, unused] : m_subparser_map) {
max_size = std::max<std::size_t>(max_size, command.size());

5037
include/3rdparty/easylogging++.h vendored Normal file

File diff suppressed because it is too large Load Diff

3526
src/3rdparty/easylogging++.cpp vendored Normal file

File diff suppressed because it is too large Load Diff