diff --git a/.clang-format b/.clang-format index b0c553c2d..9f8dec201 100644 --- a/.clang-format +++ b/.clang-format @@ -1,9 +1,10 @@ +--- Language: Cpp -# BasedOnStyle: WebKit AccessModifierOffset: -4 -AlignAfterOpenBracket: false +AlignAfterOpenBracket: DontAlign AlignConsecutiveAssignments: false -AlignEscapedNewlinesLeft: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right AlignOperands: false AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: true @@ -13,27 +14,39 @@ AllowShortFunctionsOnASingleLine: Empty AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: true -AlwaysBreakTemplateDeclarations: true +AlwaysBreakTemplateDeclarations: Yes BinPackArguments: false BinPackParameters: false +BraceWrapping: + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: true + AfterExternBlock: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true BreakBeforeBinaryOperators: All BreakBeforeBraces: Custom -BraceWrapping: - AfterClass: true - AfterControlStatement: false - AfterEnum: true - AfterFunction: true - AfterNamespace: true - AfterStruct: false - AfterUnion: true - BeforeCatch: false - BeforeElse: false - IndentBraces: false +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: false -BreakConstructorInitializersBeforeComma: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeComma +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true ColumnLimit: 120 CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 @@ -41,25 +54,55 @@ Cpp11BracedListStyle: false DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false -ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + - Regex: '.*' + Priority: 1 +IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: true +IndentPPDirectives: None IndentWidth: 4 IndentWrappedFunctionNames: false +JavaScriptQuotes: Leave +JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: All +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: Left +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: true SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false @@ -70,5 +113,5 @@ SpacesInSquareBrackets: false Standard: Cpp03 TabWidth: 4 UseTab: Never -SortIncludes: false +... diff --git a/CHANGELOG.md b/CHANGELOG.md index 590e25d2e..a3f0ef82d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ * Parameters which are of `enum` type will now have their `default` values correctly serialized in the output using `enum` type +### Enhancements + +* Add column/line info to anotations source maps + ## 4.0.0-pre.1 ### Breaking diff --git a/CMakeLists.txt b/CMakeLists.txt index 87e40587c..197d93c03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,11 @@ add_subdirectory(ext/snowcrash EXCLUDE_FROM_ALL) # drafter add_subdirectory(src) if(${BUILD_TESTING}) + option(INTEGRATION_TESTS "Run integration tests" OFF) add_subdirectory(test) + if(${INTEGRATION_TESTS}) + include(integration.cmake) + endif() add_custom_target(drafter-test-suite ALL) add_dependencies(drafter-test-suite drafter-test markdown-parser-test snowcrash-test) endif() diff --git a/drafter.gyp b/drafter.gyp index 6cca56093..47801ef20 100644 --- a/drafter.gyp +++ b/drafter.gyp @@ -263,8 +263,12 @@ "src/RefractElementFactory.cc", "src/ConversionContext.cc", "src/ConversionContext.h", - "src/ElementInfoUtils.h" - "src/ElementComparator.h" + "src/ElementInfoUtils.h", + "src/ElementComparator.h", + + + "src/SourceMapUtils.h", + "src/SourceMapUtils.cc", "src/utils/Variant.h", "src/utils/Utf8.h", @@ -412,6 +416,7 @@ "test/test-ElementInfoUtils.cc", "test/test-ElementComparator.cc", "test/test-VisitorUtils.cc", + "test/test-sourceMapToLineColumn.cc", ], 'dependencies': [ diff --git a/features/fixtures/refract.json b/features/fixtures/refract.json index c21f1dcd3..8836174d7 100644 --- a/features/fixtures/refract.json +++ b/features/fixtures/refract.json @@ -1046,10 +1046,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 39 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 685 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 42 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 } ] @@ -1090,10 +1110,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 55 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 992 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 58 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 } ] @@ -1134,10 +1174,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 7 + } + }, "content": 200 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 108 + } + }, "content": 102 } ] diff --git a/features/fixtures/refract.sourcemap.json b/features/fixtures/refract.sourcemap.json index 4b8a98664..4e90c711a 100644 --- a/features/fixtures/refract.sourcemap.json +++ b/features/fixtures/refract.sourcemap.json @@ -3218,10 +3218,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 39 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 685 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 42 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 } ] @@ -3262,10 +3282,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 55 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 992 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 58 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 } ] @@ -3306,10 +3346,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 7 + } + }, "content": 200 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 108 + } + }, "content": 102 } ] diff --git a/features/fixtures/refract.sourcemap.yaml b/features/fixtures/refract.sourcemap.yaml index feee27100..6f6e35200 100644 --- a/features/fixtures/refract.sourcemap.yaml +++ b/features/fixtures/refract.sourcemap.yaml @@ -2099,9 +2099,23 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 39 + column: + element: "number" + content: 1 content: 685 - element: "number" + attributes: + line: + element: "number" + content: 42 + column: + element: "number" + content: 1 content: 45 content: "the 'headers' section at this level is deprecated and will be removed in a future, use respective payload header section(s) instead" - @@ -2128,9 +2142,23 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 55 + column: + element: "number" + content: 1 content: 992 - element: "number" + attributes: + line: + element: "number" + content: 58 + column: + element: "number" + content: 1 content: 45 content: "the 'headers' section at this level is deprecated and will be removed in a future, use respective payload header section(s) instead" - @@ -2157,8 +2185,22 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 14 + column: + element: "number" + content: 7 content: 200 - element: "number" + attributes: + line: + element: "number" + content: 14 + column: + element: "number" + content: 108 content: 102 content: "invalid value format for 'number' type. please check mson specification for valid format" diff --git a/features/fixtures/refract.yaml b/features/fixtures/refract.yaml index 5e2b287cd..c6a2ce7a0 100644 --- a/features/fixtures/refract.yaml +++ b/features/fixtures/refract.yaml @@ -705,9 +705,23 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 39 + column: + element: "number" + content: 1 content: 685 - element: "number" + attributes: + line: + element: "number" + content: 42 + column: + element: "number" + content: 1 content: 45 content: "the 'headers' section at this level is deprecated and will be removed in a future, use respective payload header section(s) instead" - @@ -734,9 +748,23 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 55 + column: + element: "number" + content: 1 content: 992 - element: "number" + attributes: + line: + element: "number" + content: 58 + column: + element: "number" + content: 1 content: 45 content: "the 'headers' section at this level is deprecated and will be removed in a future, use respective payload header section(s) instead" - @@ -763,8 +791,22 @@ content: content: - element: "number" + attributes: + line: + element: "number" + content: 14 + column: + element: "number" + content: 7 content: 200 - element: "number" + attributes: + line: + element: "number" + content: 14 + column: + element: "number" + content: 108 content: 102 content: "invalid value format for 'number' type. please check mson specification for valid format" diff --git a/features/support/env.rb b/features/support/env.rb index 30c7a8494..00478cc99 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -3,5 +3,5 @@ Before do @dirs << "../../features/fixtures" - ENV['PATH'] = "./bin#{File::PATH_SEPARATOR}#{ENV['PATH']}" + ENV['PATH'] = "#{ENV['PWD']}/src#{File::PATH_SEPARATOR}#{ENV['PATH']}" end diff --git a/integration.cmake b/integration.cmake new file mode 100644 index 000000000..2e2941a01 --- /dev/null +++ b/integration.cmake @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.6 FATAL_ERROR) + +find_program(Bundler bundle) + +file(COPY ${CMAKE_CURRENT_LIST_DIR}/features DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +add_custom_target(BundleInstall ALL COMMAND ${Bundler} install --path vendor/bundle) +add_test(NAME DrafterIntegration COMMAND ${Bundler} exec cucumber) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3bc2283de..3de21989e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -46,6 +46,7 @@ set(DRAFTER_SOURCES Render.cc ConversionContext.cc RefractElementFactory.cc + SourceMapUtils.cc ) set(DRAFTER_COMPILE_FEATURES diff --git a/src/ConversionContext.cc b/src/ConversionContext.cc index 8ac6fadfb..e1c057fe0 100644 --- a/src/ConversionContext.cc +++ b/src/ConversionContext.cc @@ -11,6 +11,11 @@ namespace drafter { + ConversionContext::ConversionContext(const char* source, const WrapperOptions& options) + : newLinesIndex(GetLinesEndIndex(source)), options(options) + { + } + void ConversionContext::warn(const snowcrash::Warning& warning) { for (auto& item : warnings) { @@ -36,4 +41,4 @@ namespace drafter warnings.push_back(warning); } -} \ No newline at end of file +} diff --git a/src/ConversionContext.h b/src/ConversionContext.h index ef06c7e38..58a410ca1 100644 --- a/src/ConversionContext.h +++ b/src/ConversionContext.h @@ -10,6 +10,7 @@ #include "refract/Registry.h" #include "snowcrash.h" +#include "SourceMapUtils.h" namespace drafter { @@ -19,8 +20,11 @@ namespace drafter class ConversionContext { refract::Registry registry; + const NewLinesIndex newLinesIndex; public: + ConversionContext(const char* source, const WrapperOptions& options); + const WrapperOptions& options; std::vector warnings; @@ -34,7 +38,10 @@ namespace drafter return registry; } - ConversionContext(const WrapperOptions& options) : options(options) {} + inline const NewLinesIndex& GetNewLinesIndex() const + { + return newLinesIndex; + } void warn(const snowcrash::Warning& warning); }; diff --git a/src/RefractAPI.cc b/src/RefractAPI.cc index bc45b22b0..f82700f5e 100644 --- a/src/RefractAPI.cc +++ b/src/RefractAPI.cc @@ -613,7 +613,7 @@ std::unique_ptr drafter::BlueprintToRefract( } std::unique_ptr drafter::AnnotationToRefract( - const snowcrash::SourceAnnotation& annotation, const std::string& key) + const snowcrash::SourceAnnotation& annotation, const std::string& key, ConversionContext& context) { auto element = from_primitive(annotation.message); @@ -622,7 +622,8 @@ std::unique_ptr drafter::AnnotationToRefract( element->meta().set(SerializeKey::Classes, make_element(from_primitive(key))); element->attributes().set(SerializeKey::AnnotationCode, from_primitive(annotation.code)); - element->attributes().set(SerializeKey::SourceMap, SourceMapToRefract(annotation.location)); + element->attributes().set( + SerializeKey::SourceMap, SourceMapToRefractWithColumnLineInfo(annotation.location, context)); return std::move(element); } diff --git a/src/RefractAPI.h b/src/RefractAPI.h index e1b1c86dc..175a2ab7d 100644 --- a/src/RefractAPI.h +++ b/src/RefractAPI.h @@ -22,7 +22,7 @@ namespace drafter class ConversionContext; std::unique_ptr AnnotationToRefract( - const snowcrash::SourceAnnotation& annotation, const std::string& key); + const snowcrash::SourceAnnotation& annotation, const std::string& key, ConversionContext& context); std::unique_ptr DataStructureToRefract( const NodeInfo& dataStructure, ConversionContext& context); diff --git a/src/RefractSourceMap.cc b/src/RefractSourceMap.cc index 9afae4081..145de3d6c 100644 --- a/src/RefractSourceMap.cc +++ b/src/RefractSourceMap.cc @@ -1,4 +1,5 @@ #include "RefractSourceMap.h" +#include "ConversionContext.h" using namespace refract; @@ -10,6 +11,7 @@ namespace from_primitive(sourceMap.location), from_primitive(sourceMap.length)); } + } // namespace std::unique_ptr drafter::SourceMapToRefract(const mdp::CharactersRangeSet& sourceMap) @@ -26,6 +28,33 @@ std::unique_ptr drafter::SourceMapToRefract(const mdp::CharactersRange return make_element(std::move(sourceMapElement)); } +std::unique_ptr drafter::SourceMapToRefractWithColumnLineInfo( + const mdp::CharactersRangeSet& sourceMap, const ConversionContext& context) +{ + auto sourceMapElement = make_element(); + sourceMapElement->element(SerializeKey::SourceMap); + + std::transform( // + sourceMap.begin(), + sourceMap.end(), + std::back_inserter(sourceMapElement->get()), + [&context](auto& sourceMap) { + auto position = GetLineFromMap(context.GetNewLinesIndex(), sourceMap); + + auto location = make_element(sourceMap.location); + location->attributes().set("line", from_primitive(position.fromLine)); + location->attributes().set("column", from_primitive(position.fromColumn)); + + auto length = make_element(sourceMap.length); + length->attributes().set("line", from_primitive(position.toLine)); + length->attributes().set("column", from_primitive(position.toColumn)); + + return make_element(std::move(location), std::move(length)); + }); + + return make_element(std::move(sourceMapElement)); +} + std::unique_ptr drafter::LiteralToRefract( const NodeInfo& literal, ConversionContext& context) { diff --git a/src/RefractSourceMap.h b/src/RefractSourceMap.h index 5c8a9c3f2..525ab3304 100644 --- a/src/RefractSourceMap.h +++ b/src/RefractSourceMap.h @@ -14,7 +14,11 @@ namespace drafter { + class ConversionContext; + std::unique_ptr SourceMapToRefract(const mdp::CharactersRangeSet& sourceMap); + std::unique_ptr SourceMapToRefractWithColumnLineInfo( + const mdp::CharactersRangeSet& sourceMap, const ConversionContext& context); template void AttachSourceMap(refract::IElement& element, const T& nodeInfo) @@ -32,8 +36,6 @@ namespace drafter return std::move(element); } - class ConversionContext; - std::unique_ptr LiteralToRefract( const NodeInfo& literal, ConversionContext& context); } diff --git a/src/SerializeResult.cc b/src/SerializeResult.cc index 4785d5ab3..2f5d70417 100644 --- a/src/SerializeResult.cc +++ b/src/SerializeResult.cc @@ -26,12 +26,13 @@ namespace helper struct AnnotationToRefract { const std::string& key; + ConversionContext& context; - AnnotationToRefract(const std::string& key) : key(key) {} + AnnotationToRefract(const std::string& key, ConversionContext& context) : key(key), context(context) {} auto operator()(snowcrash::SourceAnnotation& annotation) { - return drafter::AnnotationToRefract(annotation, key); + return drafter::AnnotationToRefract(annotation, key, context); } }; } @@ -69,7 +70,7 @@ std::unique_ptr drafter::WrapRefract( } if (blueprint.report.error.code != snowcrash::Error::OK) { - parseResult->get().push_back(helper::AnnotationToRefract(SerializeKey::Error)(blueprint.report.error)); + parseResult->get().push_back(helper::AnnotationToRefract(SerializeKey::Error, context)(blueprint.report.error)); } snowcrash::Warnings& warnings = blueprint.report.warnings; @@ -82,7 +83,7 @@ std::unique_ptr drafter::WrapRefract( std::transform(warnings.begin(), warnings.end(), std::back_inserter(parseResult->get()), - helper::AnnotationToRefract(SerializeKey::Warning)); + helper::AnnotationToRefract(SerializeKey::Warning, context)); } return parseResult; diff --git a/src/SourceMapUtils.cc b/src/SourceMapUtils.cc new file mode 100644 index 000000000..780ca9cf0 --- /dev/null +++ b/src/SourceMapUtils.cc @@ -0,0 +1,71 @@ +#include "SourceMapUtils.h" +#include + +#include "utils/Utf8.h" + +#include + +namespace drafter +{ + + const AnnotationPosition GetLineFromMap(const NewLinesIndex& linesEndIndex, const mdp::Range& range) + { + // Finds starting line and column position + AnnotationPosition out; + if (linesEndIndex.empty()) { // to avoid std::prev() on empty + return out; + } + + auto annotationPositionIt = std::upper_bound(linesEndIndex.begin(), linesEndIndex.end(), range.location); + + if (annotationPositionIt != linesEndIndex.end()) { + out.fromLine = std::distance(linesEndIndex.begin(), annotationPositionIt); + out.fromColumn = range.location - *std::prev(annotationPositionIt) + 1; + } + + // Finds ending line and column position + annotationPositionIt + = std::lower_bound(linesEndIndex.begin(), linesEndIndex.end(), range.location + range.length); + + // + // FIXME: workaround for byte mapping + // handle just case when position is after latest newline + // remove once all sourceMaps will correctly send character ranges + // + + if (linesEndIndex.back() < (range.location + range.length)) { + out.toLine = linesEndIndex.size(); + out.toColumn = 1; + return out; + } + + // end of byte mapping workarround + + if (annotationPositionIt != linesEndIndex.end()) { + out.toLine = std::distance(linesEndIndex.begin(), annotationPositionIt); + out.toColumn = (range.location + range.length) - *(std::prev(annotationPositionIt)); + } + + return out; + } + + const NewLinesIndex GetLinesEndIndex(const std::string& source) + { + + NewLinesIndex out; + + out.push_back(0); + + utils::utf8::input_iterator it(source); + utils::utf8::input_iterator e{ source.end(), source.end() }; + + int i = 1; + for (; it != e; ++it, ++i) { + if (*it == '\n') + out.push_back(i); + } + + return out; + } + +} // namespace drafter diff --git a/src/SourceMapUtils.h b/src/SourceMapUtils.h new file mode 100644 index 000000000..85ac810ba --- /dev/null +++ b/src/SourceMapUtils.h @@ -0,0 +1,44 @@ +// +// SourceMapUtils.h +// librafter +// +// Created by Jiri Kratochvil on 2018-10-02 +// Copyright (c) 2018 Apiary Inc. All rights reserved. +// + +#ifndef DRAFTER_SOURCEMAPUTILS_H +#define DRAFTER_SOURCEMAPUTILS_H + +#include "SourceAnnotation.h" + +namespace drafter +{ + + using NewLinesIndex = std::vector; + + /** structure contains starting and ending position of a error/warning. */ + struct AnnotationPosition { + size_t fromLine = 0; + size_t fromColumn = 0; + size_t toLine = 0; + size_t toColumn = 0; + }; + + /** + * \brief Convert character index mapping to line and column number + * \return out Position of the given range as output + * \param linesEndIndex Vector containing indexes of end line characters + * \param range Character index mapping as input + */ + const AnnotationPosition GetLineFromMap(const NewLinesIndex& linesEndIndex, const mdp::Range& range); + + /** + * \brief Given the source returns the length of all the lines in source as a vector + * \param source Source data + * \param out Vector containing indexes of all end line character in source + */ + const NewLinesIndex GetLinesEndIndex(const std::string& source); + +} // namespace drafter + +#endif diff --git a/src/drafter.cc b/src/drafter.cc index c8a26ccb2..86a457626 100644 --- a/src/drafter.cc +++ b/src/drafter.cc @@ -25,6 +25,8 @@ #include "Version.h" +#include "reporting.h" + #include DRAFTER_API drafter_error drafter_parse_blueprint_to(const char* source, @@ -83,7 +85,7 @@ DRAFTER_API drafter_error drafter_parse_blueprint( sc::parse(source, scOptions, blueprint); drafter::WrapperOptions wrapperOptions; - drafter::ConversionContext context(wrapperOptions); + drafter::ConversionContext context(source, wrapperOptions); auto result = WrapRefract(blueprint, context); *out = result.release(); diff --git a/src/drafter.h b/src/drafter.h index 7694ab28d..77adc1581 100644 --- a/src/drafter.h +++ b/src/drafter.h @@ -61,7 +61,11 @@ typedef refract::IElement drafter_result; #endif /* Serialization formats, currently only YAML or JSON */ -typedef enum { DRAFTER_SERIALIZE_YAML = 0, DRAFTER_SERIALIZE_JSON } drafter_format; +typedef enum +{ + DRAFTER_SERIALIZE_YAML = 0, + DRAFTER_SERIALIZE_JSON +} drafter_format; /* Parsing options * - requireBlueprintName : API has to have a name, if not it is a parsing error @@ -79,7 +83,8 @@ typedef struct { drafter_format format; } drafter_serialize_options; -typedef enum { +typedef enum +{ DRAFTER_OK = 0, DRAFTER_EUNKNOWN = -1, DRAFTER_EINVALID_INPUT = -2, diff --git a/src/refract/ElementIfc.h b/src/refract/ElementIfc.h index bf1e689f3..40da98997 100644 --- a/src/refract/ElementIfc.h +++ b/src/refract/ElementIfc.h @@ -26,7 +26,8 @@ namespace refract /// /// Composable clone flags /// - typedef enum { + typedef enum + { cMeta = 0x01, //< Clone meta cAttributes = 0x02, //< Clone attributes cValue = 0x04, //< Clone value diff --git a/src/refract/ExpandVisitor.cc b/src/refract/ExpandVisitor.cc index ceab16a79..9c9019adc 100644 --- a/src/refract/ExpandVisitor.cc +++ b/src/refract/ExpandVisitor.cc @@ -108,7 +108,7 @@ namespace refract // FIXME: add check against recursive inheritance // walk recursive in registry and expand inheritance tree - for (const IElement *parent = registry.find(en); parent && !isReserved(en); + for (const IElement* parent = registry.find(en); parent && !isReserved(en); en = parent->element(), parent = registry.find(en)) { inheritance.push(clone(*parent, ((IElement::cAll ^ IElement::cElement) | IElement::cNoMetaId))); diff --git a/src/refract/TypeQueryVisitor.h b/src/refract/TypeQueryVisitor.h index 12e8c20c3..f7d022768 100644 --- a/src/refract/TypeQueryVisitor.h +++ b/src/refract/TypeQueryVisitor.h @@ -18,7 +18,8 @@ namespace refract { public: - typedef enum { + typedef enum + { Null, Holder, diff --git a/src/refract/dsd/Extend.cc b/src/refract/dsd/Extend.cc index 53eee82bb..e3462b6e3 100644 --- a/src/refract/dsd/Extend.cc +++ b/src/refract/dsd/Extend.cc @@ -99,7 +99,6 @@ namespace assert(mergeKey); return std::find_if(value.get().begin(), value.get().end(), [mergeKey](const auto& e) { - if (auto valueMember = TypeQueryVisitor::as(e.get())) { auto valueKey = TypeQueryVisitor::as(valueMember->get().key()); assert(valueKey); diff --git a/src/reporting.cc b/src/reporting.cc index 61dec0673..619fee3f5 100644 --- a/src/reporting.cc +++ b/src/reporting.cc @@ -18,10 +18,12 @@ #include "refract/TypeQueryVisitor.h" #include "refract/VisitorUtils.h" +#include "SourceMapUtils.h" namespace sc = snowcrash; using namespace refract; +using namespace drafter; namespace { @@ -37,72 +39,6 @@ namespace return out; } - /** structure contains starting and ending position of a error/warning. */ - struct AnnotationPosition { - size_t fromLine; - size_t fromColumn; - size_t toLine; - size_t toColumn; - }; - - /** - * \brief Convert character index mapping to line and column number - * \param linesEndIndex Vector containing indexes of end line characters - * \param range Character index mapping as input - * \param out Position of the given range as output - */ - void GetLineFromMap(const std::vector& linesEndIndex, const mdp::Range& range, AnnotationPosition& out) - { - - std::vector::const_iterator annotationPositionIt; - - out.fromLine = 0; - out.fromColumn = 0; - out.toLine = 0; - out.toColumn = 0; - - // Finds starting line and column position - annotationPositionIt = std::upper_bound(linesEndIndex.begin(), linesEndIndex.end(), range.location) - 1; - - if (annotationPositionIt != linesEndIndex.end()) { - - out.fromLine = std::distance(linesEndIndex.begin(), annotationPositionIt) + 1; - out.fromColumn = range.location - *annotationPositionIt + 1; - } - - // Finds ending line and column position - annotationPositionIt - = std::lower_bound(linesEndIndex.begin(), linesEndIndex.end(), range.location + range.length) - 1; - - if (annotationPositionIt != linesEndIndex.end()) { - - out.toLine = std::distance(linesEndIndex.begin(), annotationPositionIt) + 1; - out.toColumn = (range.location + range.length) - *annotationPositionIt + 1; - - if (*(annotationPositionIt + 1) == (range.location + range.length)) { - out.toColumn--; - } - } - } - - /** - * \brief Given the source returns the length of all the lines in source as a vector - * \param source Source data - * \param out Vector containing indexes of all end line character in source - */ - void GetLinesEndIndex(const std::string& source, std::vector& out) - { - - out.push_back(0); - - for (size_t i = 0; i < source.length(); i++) { - - if (source[i] == '\n') { - out.push_back(i + 1); - } - } - } - void PrintAnnotation(const std::string& prefix, const snowcrash::SourceAnnotation& annotation, const std::string& source, @@ -119,10 +55,10 @@ namespace std::cerr << " " << annotation.message; } - std::vector linesEndIndex; + NewLinesIndex linesEndIndex; if (useLineNumbers) { - GetLinesEndIndex(source, linesEndIndex); + linesEndIndex = GetLinesEndIndex(source); } if (!annotation.location.empty()) { @@ -133,8 +69,7 @@ namespace if (useLineNumbers) { - AnnotationPosition annotationPosition; - GetLineFromMap(linesEndIndex, *it, annotationPosition); + auto annotationPosition = GetLineFromMap(linesEndIndex, *it); std::cerr << "; line " << annotationPosition.fromLine << ", column " << annotationPosition.fromColumn; @@ -158,7 +93,7 @@ namespace AnnotationToString(const std::string& source, const bool useLineNumbers) : useLineNumbers(useLineNumbers) { if (useLineNumbers) { - GetLinesEndIndex(source, linesEndIndex); + linesEndIndex = GetLinesEndIndex(source); } } @@ -174,9 +109,8 @@ namespace if (useLineNumbers) { - AnnotationPosition annotationPosition; mdp::Range pos(static_cast(loc->get()), static_cast(len->get())); - GetLineFromMap(linesEndIndex, pos, annotationPosition); + const auto annotationPosition = GetLineFromMap(linesEndIndex, pos); output << "; line " << annotationPosition.fromLine << ", column " << annotationPosition.fromColumn; diff --git a/src/utils/Variant.h b/src/utils/Variant.h index 2bf239102..4bb6ae34e 100644 --- a/src/utils/Variant.h +++ b/src/utils/Variant.h @@ -143,7 +143,7 @@ namespace drafter } template - const auto& get() const & + const auto& get() const& { static_assert(I >= 0 && I < sizeof...(Variants), "invalid index"); using Which = typename type_at::type; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 19a28eec3..d94ac75e2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(drafter-test test-CircularReferenceTest.cc test-RenderTest.cc test-Serialize.cc + test-sourceMapToLineColumn.cc ) target_link_libraries(drafter-test diff --git a/test/draftertest.h b/test/draftertest.h index d0341b864..414208b2f 100644 --- a/test/draftertest.h +++ b/test/draftertest.h @@ -17,25 +17,25 @@ #include "Serialize.h" #include "SerializeResult.h" -#define TEST_DRAFTER(description, category, name, tag, wrapper, options, mustBeOk) \ - TEST_CASE(description " " category " " name, "[" tag "][" category "][" name "]") \ +static drafter::WrapperOptions MSONTestOptions(false, true); + +#define TEST_MSON(name, mustBeOk) \ + TEST_CASE("Testing MSON serialization for " name, "[refract][MSON][" name "]") \ { \ - REQUIRE(FixtureHelper::handleResultJSON(wrapper, "test/fixtures/" category "/" name, options, mustBeOk)); \ + REQUIRE(FixtureHelper::handleResultJSON("test/fixtures/mson/" name, MSONTestOptions, mustBeOk)); \ } #define TEST_REFRACT(category, name) \ TEST_CASE("Testing refract serialization for " category " " name, "[refract][" category "][" name "]") \ { \ - FixtureHelper::handleResultJSON( \ - &FixtureHelper::parseAndSerialize, "test/fixtures/" category "/" name, drafter::WrapperOptions(false)); \ + FixtureHelper::handleResultJSON("test/fixtures/" category "/" name, drafter::WrapperOptions(false)); \ } #define TEST_REFRACT_SOURCE_MAP(category, name) \ TEST_CASE("Testing refract + source map serialization for " category " " name, \ "[refract_sourcemap][" category "][" name "]") \ { \ - FixtureHelper::handleResultJSON( \ - &FixtureHelper::parseAndSerialize, "test/fixtures/" category "/" name, drafter::WrapperOptions(true)); \ + FixtureHelper::handleResultJSON("test/fixtures/" category "/" name, drafter::WrapperOptions(true)); \ } namespace draftertest @@ -103,14 +103,6 @@ namespace draftertest struct FixtureHelper { - static std::unique_ptr parseAndSerialize( - snowcrash::ParseResult& blueprint, const drafter::WrapperOptions& options) - { - drafter::ConversionContext context(options); - - return WrapRefract(blueprint, context); - } - static const std::string printDiff(const std::string& actual, const std::string& expected) { // First, convert strings into arrays of lines. @@ -150,23 +142,22 @@ namespace draftertest return ext::json; } - typedef std::unique_ptr (*Wrapper)( - snowcrash::ParseResult& blueprint, const drafter::WrapperOptions& options); - - static bool handleResultJSON(const Wrapper wrapper, - const std::string& basepath, - const drafter::WrapperOptions& options, - bool mustBeOk = false) + static bool handleResultJSON( + const std::string& fixturePath, const drafter::WrapperOptions& options, bool mustBeOk = false) { ENABLE_LOGGING; - ITFixtureFiles fixture = ITFixtureFiles(basepath); + ITFixtureFiles fixture = ITFixtureFiles(fixturePath); snowcrash::ParseResult blueprint; - int result = snowcrash::parse(fixture.get(ext::apib), snowcrash::ExportSourcemapOption, blueprint); + const auto source = fixture.get(ext::apib); + + int result = snowcrash::parse(source, snowcrash::ExportSourcemapOption, blueprint); std::ostringstream outStream; - if (auto parsed = (*wrapper)(blueprint, options)) { + drafter::ConversionContext context(source.c_str(), options); + + if (auto parsed = WrapRefract(blueprint, context)) { auto soValue = refract::serialize::renderSo(*parsed, options.generateSourceMap); drafter::utils::so::serialize_json(outStream, soValue); } @@ -177,7 +168,7 @@ namespace draftertest std::string expected; std::string extension = getFixtureExtension(options); - INFO("Filename: \x1b[35m" << basepath << extension << "\x1b[0m"); + INFO("Filename: \x1b[35m" << fixturePath << extension << "\x1b[0m"); expected = fixture.get(extension); if (actual != expected) { diff --git a/test/fixtures/api/issue-386.sourcemap.json b/test/fixtures/api/issue-386.sourcemap.json index add9edc31..6b929af9a 100644 --- a/test/fixtures/api/issue-386.sourcemap.json +++ b/test/fixtures/api/issue-386.sourcemap.json @@ -844,10 +844,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 153 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 4 } ] diff --git a/test/fixtures/api/request-only.json b/test/fixtures/api/request-only.json index 1e1475d13..9cc2fe25c 100644 --- a/test/fixtures/api/request-only.json +++ b/test/fixtures/api/request-only.json @@ -133,10 +133,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 26 } ] diff --git a/test/fixtures/api/request-only.sourcemap.json b/test/fixtures/api/request-only.sourcemap.json index a6f082c37..1867427c6 100644 --- a/test/fixtures/api/request-only.sourcemap.json +++ b/test/fixtures/api/request-only.sourcemap.json @@ -331,10 +331,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 45 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 26 } ] diff --git a/test/fixtures/circular/mixed.json b/test/fixtures/circular/mixed.json index 0a8468d2b..0c24eefae 100644 --- a/test/fixtures/circular/mixed.json +++ b/test/fixtures/circular/mixed.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 109 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 10 } ] diff --git a/test/fixtures/circular/mixin-cross.json b/test/fixtures/circular/mixin-cross.json index 14def45e0..17f2d058c 100644 --- a/test/fixtures/circular/mixin-cross.json +++ b/test/fixtures/circular/mixin-cross.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 122 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 10 } ] diff --git a/test/fixtures/circular/mixin-embed.json b/test/fixtures/circular/mixin-embed.json index 26704e692..534ba384c 100644 --- a/test/fixtures/circular/mixin-embed.json +++ b/test/fixtures/circular/mixin-embed.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 89 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 12 } ] diff --git a/test/fixtures/circular/mixin-identity.json b/test/fixtures/circular/mixin-identity.json index 3a6e7b6b3..bf9898eaf 100644 --- a/test/fixtures/circular/mixin-identity.json +++ b/test/fixtures/circular/mixin-identity.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 98 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 10 } ] diff --git a/test/fixtures/circular/mixin-member.json b/test/fixtures/circular/mixin-member.json index 5a6db0acf..c0d8e54a1 100644 --- a/test/fixtures/circular/mixin-member.json +++ b/test/fixtures/circular/mixin-member.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 7 + } + }, "content": 102 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 16 + } + }, "content": 10 } ] diff --git a/test/fixtures/mson/check-bool-number-value-validity.json b/test/fixtures/mson/check-bool-number-value-validity.json index ba035253e..a4cb8b4a8 100644 --- a/test/fixtures/mson/check-bool-number-value-validity.json +++ b/test/fixtures/mson/check-bool-number-value-validity.json @@ -296,10 +296,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 65 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 16 + } + }, "content": 14 } ] @@ -340,10 +360,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 7 + } + }, "content": 98 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 32 + } + }, "content": 26 } ] @@ -384,10 +424,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 126 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 12 } ] @@ -428,10 +488,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 12 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 140 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 11 } ] @@ -472,10 +552,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 2 + } + }, "content": 186 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 21 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] diff --git a/test/fixtures/mson/check-default-without-value.json b/test/fixtures/mson/check-default-without-value.json index 1933e88a0..b4e0d51af 100644 --- a/test/fixtures/mson/check-default-without-value.json +++ b/test/fixtures/mson/check-default-without-value.json @@ -144,10 +144,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 66 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 25 + } + }, "content": 15 } ] diff --git a/test/fixtures/mson/check-sample-without-value.json b/test/fixtures/mson/check-sample-without-value.json index f02c37e35..19ac3ce2b 100644 --- a/test/fixtures/mson/check-sample-without-value.json +++ b/test/fixtures/mson/check-sample-without-value.json @@ -144,10 +144,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 66 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 24 + } + }, "content": 14 } ] diff --git a/test/fixtures/mson/enum-empty-default.json b/test/fixtures/mson/enum-empty-default.json index e08b0222d..37263aa9c 100644 --- a/test/fixtures/mson/enum-empty-default.json +++ b/test/fixtures/mson/enum-empty-default.json @@ -334,10 +334,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 115 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 15 + } + }, "content": 13 } ] diff --git a/test/fixtures/mson/enum-multiple-default.json b/test/fixtures/mson/enum-multiple-default.json index 8a7401e68..1f45c66a0 100644 --- a/test/fixtures/mson/enum-multiple-default.json +++ b/test/fixtures/mson/enum-multiple-default.json @@ -296,10 +296,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 69 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 10 } ] @@ -309,10 +329,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 83 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] @@ -322,10 +362,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 95 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] @@ -366,10 +426,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 12 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 122 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 12 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 10 } ] @@ -379,10 +459,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 136 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] @@ -392,10 +492,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 149 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 10 } ] @@ -405,10 +525,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 163 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] @@ -449,10 +589,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 175 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 29 + } + }, "content": 27 } ] diff --git a/test/fixtures/mson/enum-variants.json b/test/fixtures/mson/enum-variants.json index 13d2f052f..53af2bd8c 100644 --- a/test/fixtures/mson/enum-variants.json +++ b/test/fixtures/mson/enum-variants.json @@ -1663,10 +1663,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 145 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 74 + } + }, "content": 72 } ] @@ -1707,10 +1727,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 60 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 1133 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 60 + }, + "column": { + "element": "number", + "content": 38 + } + }, "content": 36 } ] @@ -1751,10 +1791,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 64 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 1188 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 64 + }, + "column": { + "element": "number", + "content": 40 + } + }, "content": 38 } ] @@ -1795,10 +1855,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 80 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 1440 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 80 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 10 } ] @@ -1808,10 +1888,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 81 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 1454 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 81 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] @@ -1821,10 +1921,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 82 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 1466 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 82 + }, + "column": { + "element": "number", + "content": 12 + } + }, "content": 8 } ] diff --git a/test/fixtures/mson/mixin-nonexistent.json b/test/fixtures/mson/mixin-nonexistent.json index aabc493c6..ac25374ec 100644 --- a/test/fixtures/mson/mixin-nonexistent.json +++ b/test/fixtures/mson/mixin-nonexistent.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 282 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 12 } ] @@ -74,10 +94,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 282 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 14 + } + }, "content": 12 } ] diff --git a/test/fixtures/mson/number-wrong-value.json b/test/fixtures/mson/number-wrong-value.json index 0bceb6a3f..9ba0db5d5 100644 --- a/test/fixtures/mson/number-wrong-value.json +++ b/test/fixtures/mson/number-wrong-value.json @@ -101,10 +101,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 334 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 30 } ] diff --git a/test/fixtures/mson/primitive-with-members.json b/test/fixtures/mson/primitive-with-members.json index e0a985709..95ea7e438 100644 --- a/test/fixtures/mson/primitive-with-members.json +++ b/test/fixtures/mson/primitive-with-members.json @@ -144,10 +144,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 74 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -188,10 +208,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 74 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -232,10 +272,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 105 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -276,10 +336,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 105 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -320,10 +400,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 134 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -364,10 +464,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 134 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] @@ -408,10 +528,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 165 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 15 + } + }, "content": 15 } ] @@ -452,10 +592,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 165 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 15 + } + }, "content": 15 } ] @@ -496,10 +656,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 18 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 180 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 6 } ] diff --git a/test/fixtures/mson/regression-269.json b/test/fixtures/mson/regression-269.json index fc3aa0d26..86880cc77 100644 --- a/test/fixtures/mson/regression-269.json +++ b/test/fixtures/mson/regression-269.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 19 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 10 + } + }, "content": 10 } ] diff --git a/test/fixtures/mson/resource-primitive-mixin.json b/test/fixtures/mson/resource-primitive-mixin.json index e5ccbe657..08ccf1eca 100644 --- a/test/fixtures/mson/resource-primitive-mixin.json +++ b/test/fixtures/mson/resource-primitive-mixin.json @@ -99,10 +99,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 7 + } + }, "content": 45 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 21 + } + }, "content": 15 } ] @@ -143,10 +163,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 43 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 21 + } + }, "content": 17 } ] diff --git a/test/fixtures/mson/resource-unresolved-reference.json b/test/fixtures/mson/resource-unresolved-reference.json index 1c323f23c..9a79dd035 100644 --- a/test/fixtures/mson/resource-unresolved-reference.json +++ b/test/fixtures/mson/resource-unresolved-reference.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 99 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 22 + } + }, "content": 20 } ] @@ -74,10 +94,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 76 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 21 } ] diff --git a/test/fixtures/mson/type-attributes-payload.json b/test/fixtures/mson/type-attributes-payload.json index 876e368ea..db6e0327b 100644 --- a/test/fixtures/mson/type-attributes-payload.json +++ b/test/fixtures/mson/type-attributes-payload.json @@ -219,10 +219,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 85 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 33 + } + }, "content": 23 } ] diff --git a/test/fixtures/mson/type-attributes-payload.sourcemap.json b/test/fixtures/mson/type-attributes-payload.sourcemap.json index 1ed2a14d7..b71ccbdd5 100644 --- a/test/fixtures/mson/type-attributes-payload.sourcemap.json +++ b/test/fixtures/mson/type-attributes-payload.sourcemap.json @@ -442,10 +442,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 85 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 33 + } + }, "content": 23 } ] diff --git a/test/fixtures/mson/type-attributes.json b/test/fixtures/mson/type-attributes.json index 24d9b6a47..036014f4d 100644 --- a/test/fixtures/mson/type-attributes.json +++ b/test/fixtures/mson/type-attributes.json @@ -121,10 +121,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -165,10 +185,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -209,10 +249,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -253,10 +313,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] diff --git a/test/fixtures/mson/type-attributes.sourcemap.json b/test/fixtures/mson/type-attributes.sourcemap.json index 94e4187d0..fa6a4c7fe 100644 --- a/test/fixtures/mson/type-attributes.sourcemap.json +++ b/test/fixtures/mson/type-attributes.sourcemap.json @@ -194,10 +194,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -238,10 +258,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -282,10 +322,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] @@ -326,10 +386,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 3 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 64 + } + }, "content": 62 } ] diff --git a/test/fixtures/parse-result/blueprint.json b/test/fixtures/parse-result/blueprint.json index e7cb242a5..8ae4e9bc0 100644 --- a/test/fixtures/parse-result/blueprint.json +++ b/test/fixtures/parse-result/blueprint.json @@ -130,10 +130,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 87 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 24 + } + }, "content": 24 } ] diff --git a/test/fixtures/parse-result/blueprint.sourcemap.json b/test/fixtures/parse-result/blueprint.sourcemap.json index e8345cd68..5717ad5ba 100644 --- a/test/fixtures/parse-result/blueprint.sourcemap.json +++ b/test/fixtures/parse-result/blueprint.sourcemap.json @@ -330,10 +330,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 87 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 24 + } + }, "content": 24 } ] diff --git a/test/fixtures/parse-result/error-warning.json b/test/fixtures/parse-result/error-warning.json index 21f5e16a6..08db9975b 100644 --- a/test/fixtures/parse-result/error-warning.json +++ b/test/fixtures/parse-result/error-warning.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 55 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 9 + } + }, "content": 9 } ] @@ -74,10 +94,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 8 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] diff --git a/test/fixtures/parse-result/error-warning.sourcemap.json b/test/fixtures/parse-result/error-warning.sourcemap.json index 21f5e16a6..08db9975b 100644 --- a/test/fixtures/parse-result/error-warning.sourcemap.json +++ b/test/fixtures/parse-result/error-warning.sourcemap.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 55 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 9 + } + }, "content": 9 } ] @@ -74,10 +94,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 8 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 2 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] diff --git a/test/fixtures/parse-result/warning.json b/test/fixtures/parse-result/warning.json index 291a1e750..2c625b551 100644 --- a/test/fixtures/parse-result/warning.json +++ b/test/fixtures/parse-result/warning.json @@ -123,10 +123,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] diff --git a/test/fixtures/parse-result/warning.sourcemap.json b/test/fixtures/parse-result/warning.sourcemap.json index f3c85c182..4831b1239 100644 --- a/test/fixtures/parse-result/warning.sourcemap.json +++ b/test/fixtures/parse-result/warning.sourcemap.json @@ -246,10 +246,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] diff --git a/test/fixtures/parse-result/warnings.json b/test/fixtures/parse-result/warnings.json index 93a9d759f..0035c7371 100644 --- a/test/fixtures/parse-result/warnings.json +++ b/test/fixtures/parse-result/warnings.json @@ -139,10 +139,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] @@ -183,10 +203,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 37 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 27 } ] diff --git a/test/fixtures/parse-result/warnings.sourcemap.json b/test/fixtures/parse-result/warnings.sourcemap.json index 144b3b501..7b45e29df 100644 --- a/test/fixtures/parse-result/warnings.sourcemap.json +++ b/test/fixtures/parse-result/warnings.sourcemap.json @@ -287,10 +287,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 24 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 13 } ] @@ -331,10 +351,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 37 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 27 } ] diff --git a/test/fixtures/render/enum-default-multiple.json b/test/fixtures/render/enum-default-multiple.json index 858fc9279..7f6263eaf 100644 --- a/test/fixtures/render/enum-default-multiple.json +++ b/test/fixtures/render/enum-default-multiple.json @@ -274,10 +274,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 115 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 25 + } + }, "content": 13 } ] @@ -287,10 +307,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 140 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 25 + } + }, "content": 13 } ] @@ -300,10 +340,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 13 + } + }, "content": 165 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 25 + } + }, "content": 13 } ] diff --git a/test/fixtures/render/issue-246.json b/test/fixtures/render/issue-246.json index eb6a5868b..7b2c0fe6f 100644 --- a/test/fixtures/render/issue-246.json +++ b/test/fixtures/render/issue-246.json @@ -283,10 +283,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 128 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 23 + } + }, "content": 19 } ] @@ -327,10 +347,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 161 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 31 } ] @@ -371,10 +411,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 192 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 21 } ] @@ -415,10 +475,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 18 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 213 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 13 } ] @@ -459,10 +539,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 21 + }, + "column": { + "element": "number", + "content": 5 + } + }, "content": 240 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 21 + }, + "column": { + "element": "number", + "content": 23 + } + }, "content": 19 } ] diff --git a/test/fixtures/render/issue-318.json b/test/fixtures/render/issue-318.json index 1549c1673..3ac7090e0 100644 --- a/test/fixtures/render/issue-318.json +++ b/test/fixtures/render/issue-318.json @@ -283,10 +283,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 118 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 12 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 28 } ] @@ -327,10 +347,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 13 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 146 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 36 } ] @@ -371,10 +411,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 182 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 20 } ] diff --git a/test/fixtures/render/issue-328-1.json b/test/fixtures/render/issue-328-1.json index 3b8aac5b3..75526dfe9 100644 --- a/test/fixtures/render/issue-328-1.json +++ b/test/fixtures/render/issue-328-1.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 30 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 18 } ] diff --git a/test/fixtures/render/issue-328-2.json b/test/fixtures/render/issue-328-2.json index 4ff4b1657..26b3f5f9a 100644 --- a/test/fixtures/render/issue-328-2.json +++ b/test/fixtures/render/issue-328-2.json @@ -30,10 +30,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 6 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 35 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 18 } ] @@ -74,10 +94,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 10 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 73 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 11 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 15 } ] diff --git a/test/fixtures/render/issue-547.json b/test/fixtures/render/issue-547.json index 0e6398e09..6fbe4cac2 100644 --- a/test/fixtures/render/issue-547.json +++ b/test/fixtures/render/issue-547.json @@ -170,10 +170,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 71 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 18 + } + }, "content": 8 } ] diff --git a/test/fixtures/render/numbers.json b/test/fixtures/render/numbers.json index 236bd8afa..bbd6011d1 100644 --- a/test/fixtures/render/numbers.json +++ b/test/fixtures/render/numbers.json @@ -448,10 +448,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 791 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 14 + }, + "column": { + "element": "number", + "content": 47 + } + }, "content": 37 } ] @@ -492,10 +512,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 838 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 15 + }, + "column": { + "element": "number", + "content": 71 + } + }, "content": 61 } ] @@ -536,10 +576,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 909 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 16 + }, + "column": { + "element": "number", + "content": 51 + } + }, "content": 41 } ] @@ -580,10 +640,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 960 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 17 + }, + "column": { + "element": "number", + "content": 53 + } + }, "content": 43 } ] @@ -624,10 +704,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 18 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 1013 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 18 + }, + "column": { + "element": "number", + "content": 54 + } + }, "content": 44 } ] @@ -668,10 +768,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 1067 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 19 + }, + "column": { + "element": "number", + "content": 48 + } + }, "content": 38 } ] @@ -712,10 +832,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 20 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 1115 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 20 + }, + "column": { + "element": "number", + "content": 55 + } + }, "content": 45 } ] @@ -756,10 +896,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 21 + }, + "column": { + "element": "number", + "content": 11 + } + }, "content": 1170 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 21 + }, + "column": { + "element": "number", + "content": 38 + } + }, "content": 28 } ] diff --git a/test/fixtures/syntax/issue-350.json b/test/fixtures/syntax/issue-350.json index ce247535b..e60fd9d4c 100644 --- a/test/fixtures/syntax/issue-350.json +++ b/test/fixtures/syntax/issue-350.json @@ -126,10 +126,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 3 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 32 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 4 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 34 } ] @@ -170,10 +190,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 5 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 66 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 7 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 44 } ] @@ -214,10 +254,30 @@ "content": [ { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 8 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 110 }, { "element": "number", + "attributes": { + "line": { + "element": "number", + "content": 9 + }, + "column": { + "element": "number", + "content": 1 + } + }, "content": 16 } ] diff --git a/test/test-RefractDataStructureTest.cc b/test/test-RefractDataStructureTest.cc index 10af69459..e48ac83e2 100644 --- a/test/test-RefractDataStructureTest.cc +++ b/test/test-RefractDataStructureTest.cc @@ -2,16 +2,6 @@ using namespace draftertest; -static drafter::WrapperOptions MSONTestOptions(false, true); - -#define TEST_MSON(file, mustBeOk) \ - TEST_DRAFTER("Testing MSON serialization for", \ - "mson", \ - file, \ - "refract", \ - &FixtureHelper::parseAndSerialize, \ - MSONTestOptions, \ - mustBeOk) #define TEST_MSON_SUCCESS(file) TEST_MSON(file, true) TEST_MSON_SUCCESS("primitives"); diff --git a/test/test-sourceMapToLineColumn.cc b/test/test-sourceMapToLineColumn.cc new file mode 100644 index 000000000..24108b73e --- /dev/null +++ b/test/test-sourceMapToLineColumn.cc @@ -0,0 +1,163 @@ +#include + +#include "../src/SourceMapUtils.h" + +#include + +using namespace drafter; + +/* +Map: +'^' - newline +'_' - other character + +01234567 + +____^ 1, 5 +____^ 6, 5 +^ 11, 1 +___^ 12, 4 +__^ 16, 3 +_______^ 19, 8 +*/ + +static const NewLinesIndex nlIndex = { 0, 5, 10, 11, 15, 18, 26 }; + +TEST_CASE("AnnotationPosition is initialized to zero", "[sourcemap utils]") +{ + AnnotationPosition a; + + REQUIRE(a.fromLine == 0); + REQUIRE(a.fromColumn == 0); + REQUIRE(a.toLine == 0); + REQUIRE(a.toColumn == 0); +} + +TEST_CASE("GetLineFromMap for position [0,3]", "[sourcemap utils]") +{ + mdp::Range r = { 0, 3 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 1); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 1); + REQUIRE(a.toColumn == 3); +} + +TEST_CASE("GetLineFromMap for position - 1st line w/o NL", "[sourcemap utils]") +{ + mdp::Range r = { 0, 4 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 1); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 1); + REQUIRE(a.toColumn == 4); +} + +TEST_CASE("GetLineFromMap for position - 1st line w/ NL", "[sourcemap utils]") +{ + mdp::Range r = { 0, 5 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 1); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 1); + REQUIRE(a.toColumn == 5); +} + +TEST_CASE("GetLineFromMap for position - 2nd line w/ NL", "[sourcemap utils]") +{ + mdp::Range r = { 5, 5 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 2); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 2); + REQUIRE(a.toColumn == 5); +} + +TEST_CASE("GetLineFromMap for position - last line w/ NL", "[sourcemap utils]") +{ + mdp::Range r = { 18, 8 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 6); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 6); + REQUIRE(a.toColumn == 8); +} + +TEST_CASE("GetLineFromMap for position - 3rd empty line - just NL", "[sourcemap utils]") +{ + mdp::Range r = { 10, 1 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 3); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 3); + REQUIRE(a.toColumn == 1); +} + +TEST_CASE("GetLineFromMap for position - 1st two lines", "[sourcemap utils]") +{ + mdp::Range r = { 0, 10 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 1); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 2); + REQUIRE(a.toColumn == 5); +} + +TEST_CASE("GetLineFromMap for position - lines 1-3", "[sourcemap utils]") +{ + mdp::Range r = { 5, 10 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 2); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 4); + REQUIRE(a.toColumn == 4); +} + +TEST_CASE("GetLineFromMap for position - all lines", "[sourcemap utils]") +{ + mdp::Range r = { 0, 26 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 1); + REQUIRE(a.fromColumn == 1); + REQUIRE(a.toLine == 6); + REQUIRE(a.toColumn == 8); +} + +TEST_CASE("GetLineFromMap for position - range is overflowing last char index", "[sourcemap utils workaround]") +{ + mdp::Range r = { 22, 10 }; + + const auto a = GetLineFromMap(nlIndex, r); + + REQUIRE(a.fromLine == 6); + REQUIRE(a.fromColumn == 5); + REQUIRE(a.toLine == 7); + REQUIRE(a.toColumn == 1); +} + +TEST_CASE("GetLinesEndIndex - check indexing utf8 chars", "[sourcemap utils]") +{ + const static std::string input = "$\n¢\n€\n𐍈\n"; // 0, 2, 4, 6, 8 + const NewLinesIndex expected = { 0, 2, 4, 6, 8 }; + + const auto out = GetLinesEndIndex(input); + REQUIRE(std::equal(expected.begin(), expected.end(), out.begin())); +} diff --git a/tools/clang-format-check.sh b/tools/clang-format-check.sh index 8ac09fc65..63cbb3ea7 100755 --- a/tools/clang-format-check.sh +++ b/tools/clang-format-check.sh @@ -7,6 +7,4 @@ function report_error () { exit 1; } -clang-format --version | cut -d ' ' -f 3 | grep -q "^5\." || (echo "Requires clang-format version 5" && exit 1) - clang-format -style=file -output-replacements-xml $(git ls-files | grep -e '\.cc$\|\.h$' | grep -v 'ext/boost') | awk '/\