193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//===- unittest/Support/YAMLParserTest ------------------------------------===// 293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// 393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// The LLVM Compiler Infrastructure 493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// 593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// This file is distributed under the University of Illinois Open Source 693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// License. See LICENSE.TXT for details. 793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// 893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer//===----------------------------------------------------------------------===// 993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 1093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/ADT/SmallString.h" 1193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/ADT/Twine.h" 1293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/Casting.h" 13525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva#include "llvm/Support/MemoryBuffer.h" 1493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/SourceMgr.h" 1593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "llvm/Support/YAMLParser.h" 1693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer#include "gtest/gtest.h" 1793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 1893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencernamespace llvm { 1993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 20d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzikstatic void SuppressDiagnosticsOutput(const SMDiagnostic &, void *) { 21d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik // Prevent SourceMgr from writing errors to stderr 22d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik // to reduce noise in unit test runs. 23d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik} 24d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik 25525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva// Assumes Ctx is an SMDiagnostic where Diag can be stored. 26525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silvastatic void CollectDiagnosticsOutput(const SMDiagnostic &Diag, void *Ctx) { 27525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SMDiagnostic* DiagOut = static_cast<SMDiagnostic*>(Ctx); 28525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva *DiagOut = Diag; 29525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva} 30525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 3193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given input gives a parse error. Makes sure that an error 3293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// text is available and the parse fails. 3393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectParseError(StringRef Message, StringRef Input) { 3493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer SourceMgr SM; 3593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::Stream Stream(Input, SM); 36d7122b8d3c48eab05d425c99fee53cde07feafe4Nick Kledzik SM.setDiagHandler(SuppressDiagnosticsOutput); 3793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer EXPECT_FALSE(Stream.validate()) << Message << ": " << Input; 3893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer EXPECT_TRUE(Stream.failed()) << Message << ": " << Input; 3993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 4093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 4193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given input can be parsed without error. 4293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectParseSuccess(StringRef Message, StringRef Input) { 4393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer SourceMgr SM; 4493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::Stream Stream(Input, SM); 4593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer EXPECT_TRUE(Stream.validate()) << Message << ": " << Input; 4693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 4793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 4893210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyArray) { 4993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Empty array", "[]"); 5093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 5193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 5293210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfNotClosingArray) { 5393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Not closing array", "["); 5493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Not closing array", " [ "); 5593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Not closing array", " [x"); 5693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 5793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 5893210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyArrayWithWhitespace) { 5993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Array with spaces", " [ ] "); 6093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("All whitespaces", "\t\r\n[\t\n \t\r ]\t\r \n\n"); 6193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 6293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 6393210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyObject) { 6493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Empty object", "[{}]"); 6593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 6693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 6793210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesObject) { 6893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Object with an entry", "[{\"a\":\"/b\"}]"); 6993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 7093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 7193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesMultipleKeyValuePairsInObject) { 7293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Multiple key, value pairs", 7393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "[{\"a\":\"/b\",\"c\":\"d\",\"e\":\"f\"}]"); 7493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 7593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 7693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfNotClosingObject) { 7793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing close on empty", "[{]"); 7893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing close after pair", "[{\"a\":\"b\"]"); 7993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 8093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 8193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsIfMissingColon) { 8293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing colon between key and value", "[{\"a\"\"/b\"}]"); 8393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing colon between key and value", "[{\"a\" \"b\"}]"); 8493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 8593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 8693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsOnMissingQuote) { 8793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing open quote", "[{a\":\"b\"}]"); 8893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("Missing closing quote", "[{\"a\":\"b}]"); 8993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 9093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 9193210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEscapedQuotes) { 9293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Parses escaped string in key and value", 9393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "[{\"a\":\"\\\"b\\\" \\\" \\\"\"}]"); 9493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 9593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 9693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesEmptyString) { 9793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Parses empty string in value", "[{\"a\":\"\"}]"); 9893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 9993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 10093210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesMultipleObjects) { 10193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess( 10293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "Multiple objects in array", 10393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "[" 10493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " { \"a\" : \"b\" }," 10593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " { \"a\" : \"b\" }," 10693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " { \"a\" : \"b\" }" 10793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "]"); 10893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 10993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 11093210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, FailsOnMissingComma) { 11193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError( 11293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "Missing comma", 11393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "[" 11493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " { \"a\" : \"b\" }" 11593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " { \"a\" : \"b\" }" 11693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "]"); 11793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 11893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 11993210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesSpacesInBetweenTokens) { 12093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess( 12193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer "Various whitespace between tokens", 12293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " \t \n\n \r [ \t \n\n \r" 12393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :" 12493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r,\t \n\n \r" 12593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " \t \n\n \r { \t \n\n \r\"a\"\t \n\n \r :" 12693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer " \t \n\n \r \"b\"\t \n\n \r } \t \n\n \r]\t \n\n \r"); 12793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 12893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 12993210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesArrayOfArrays) { 13093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseSuccess("Array of arrays", "[[]]"); 13193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 13293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 13393210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, HandlesEndOfFileGracefully) { 13493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In string starting with EOF", "[\""); 13593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In string hitting EOF", "[\" "); 13693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In string escaping EOF", "[\" \\"); 13793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In array starting with EOF", "["); 13893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In array element starting with EOF", "[[], "); 13993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In array hitting EOF", "[[] "); 14093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In array hitting EOF", "[[]"); 14193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError("In object hitting EOF", "{\"\""); 14293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 14393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 14493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that the given string can be parsed into an identical string inside 14593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// of an array. 14693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectCanParseString(StringRef String) { 14793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str(); 14893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer SourceMgr SM; 14993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::Stream Stream(StringInArray, SM); 15093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::SequenceNode *ParsedSequence 15193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot()); 15293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer StringRef ParsedString 15393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer = dyn_cast<yaml::ScalarNode>( 15493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer static_cast<yaml::Node*>(ParsedSequence->begin()))->getRawValue(); 15593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ParsedString = ParsedString.substr(1, ParsedString.size() - 2); 15693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer EXPECT_EQ(String, ParsedString.str()); 15793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 15893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 15993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer// Checks that parsing the given string inside an array fails. 16093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencerstatic void ExpectCannotParseString(StringRef String) { 16193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer std::string StringInArray = (llvm::Twine("[\"") + String + "\"]").str(); 16293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectParseError((Twine("When parsing string \"") + String + "\"").str(), 16393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer StringInArray); 16493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 16593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 16693210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, ParsesStrings) { 16793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString(""); 16893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString("\\"); 16993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString("\""); 17093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString(" "); 17193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\ "); 17293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\\""); 17393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString("\"\\"); 17493210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString(" \\"); 17593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\\\"); 17693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString("\\\\\\"); 17793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\\\\\\\"); 17893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\\" "); 17993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCannotParseString("\\\\\" "); 18093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString("\\\\\\\" "); 18193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer ExpectCanParseString(" \\\\ \\\" \\\\\\\" "); 18293210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 18393210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 18493210e847a1496b24cef881723e57c489082dcfeMichael J. SpencerTEST(YAMLParser, WorksWithIteratorAlgorithms) { 18593210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer SourceMgr SM; 18693210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::Stream Stream("[\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"]", SM); 18793210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer yaml::SequenceNode *Array 18893210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer = dyn_cast<yaml::SequenceNode>(Stream.begin()->getRoot()); 18993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer EXPECT_EQ(6, std::distance(Array->begin(), Array->end())); 19093210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} 19193210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer 192525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean SilvaTEST(YAMLParser, DefaultDiagnosticFilename) { 193525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SourceMgr SM; 194525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 195525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SMDiagnostic GeneratedDiag; 196525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag); 197525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 198525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva // When we construct a YAML stream over an unnamed string, 199525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva // the filename is hard-coded as "YAML". 200525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva yaml::Stream UnnamedStream("[]", SM); 201525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva UnnamedStream.printError(UnnamedStream.begin()->getRoot(), "Hello, World!"); 202525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva EXPECT_EQ("YAML", GeneratedDiag.getFilename()); 203525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva} 204525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 205525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean SilvaTEST(YAMLParser, DiagnosticFilenameFromBufferID) { 206525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SourceMgr SM; 207525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 208525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SMDiagnostic GeneratedDiag; 209525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva SM.setDiagHandler(CollectDiagnosticsOutput, &GeneratedDiag); 210525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 211525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva // When we construct a YAML stream over a named buffer, 212525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva // we get its ID as filename in diagnostics. 213525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva MemoryBuffer* Buffer = MemoryBuffer::getMemBuffer("[]", "buffername.yaml"); 214525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva yaml::Stream Stream(Buffer, SM); 215525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva Stream.printError(Stream.begin()->getRoot(), "Hello, World!"); 216525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename()); 217525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva} 218525398e1376b0d61fe80a83ed2261e2e6e6ab4a3Sean Silva 21993210e847a1496b24cef881723e57c489082dcfeMichael J. Spencer} // end namespace llvm 220