@@ -1453,6 +1453,160 @@ TEST_F(CommentLexerTest, HTML19) {
14531453 ASSERT_EQ (tok::newline, Toks[2 ].getKind ());
14541454}
14551455
1456+ TEST_F (CommentLexerTest, HTML20) {
1457+ const char *Source = " // <a\n "
1458+ " // \n "
1459+ " // href=\" foo\"\n "
1460+ " // \n "
1461+ " // bar>text</a>" ;
1462+
1463+ std::vector<Token> Toks;
1464+
1465+ lexString (Source, Toks);
1466+
1467+ ASSERT_EQ (11U , Toks.size ());
1468+
1469+ ASSERT_EQ (tok::text, Toks[0 ].getKind ());
1470+ ASSERT_EQ (StringRef (" " ), Toks[0 ].getText ());
1471+
1472+ ASSERT_EQ (tok::html_start_tag, Toks[1 ].getKind ());
1473+ ASSERT_EQ (StringRef (" a" ), Toks[1 ].getHTMLTagStartName ());
1474+
1475+ ASSERT_EQ (tok::html_ident, Toks[2 ].getKind ());
1476+ ASSERT_EQ (StringRef (" href" ), Toks[2 ].getHTMLIdent ());
1477+
1478+ ASSERT_EQ (tok::html_equals, Toks[3 ].getKind ());
1479+
1480+ ASSERT_EQ (tok::html_quoted_string, Toks[4 ].getKind ());
1481+ ASSERT_EQ (StringRef (" foo" ), Toks[4 ].getHTMLQuotedString ());
1482+
1483+ ASSERT_EQ (tok::html_ident, Toks[5 ].getKind ());
1484+ ASSERT_EQ (StringRef (" bar" ), Toks[5 ].getHTMLIdent ());
1485+
1486+ ASSERT_EQ (tok::html_greater, Toks[6 ].getKind ());
1487+
1488+ ASSERT_EQ (tok::text, Toks[7 ].getKind ());
1489+ ASSERT_EQ (StringRef (" text" ), Toks[7 ].getText ());
1490+
1491+ ASSERT_EQ (tok::html_end_tag, Toks[8 ].getKind ());
1492+ ASSERT_EQ (StringRef (" a" ), Toks[8 ].getHTMLTagEndName ());
1493+
1494+ ASSERT_EQ (tok::html_greater, Toks[9 ].getKind ());
1495+
1496+ ASSERT_EQ (tok::newline, Toks[10 ].getKind ());
1497+ }
1498+
1499+ TEST_F (CommentLexerTest, HTML21) {
1500+ const char *Source = " /**\n "
1501+ " * <a\n "
1502+ " * \n "
1503+ " * href=\" foo\"\n "
1504+ " * \n "
1505+ " * bar>text</a>\n "
1506+ " */" ;
1507+
1508+ std::vector<Token> Toks;
1509+
1510+ lexString (Source, Toks);
1511+
1512+ ASSERT_EQ (15U , Toks.size ());
1513+
1514+ ASSERT_EQ (tok::newline, Toks[0 ].getKind ());
1515+
1516+ ASSERT_EQ (tok::text, Toks[1 ].getKind ());
1517+ ASSERT_EQ (StringRef (" " ), Toks[1 ].getText ());
1518+
1519+ ASSERT_EQ (tok::html_start_tag, Toks[2 ].getKind ());
1520+ ASSERT_EQ (StringRef (" a" ), Toks[2 ].getHTMLTagStartName ());
1521+
1522+ ASSERT_EQ (tok::html_ident, Toks[3 ].getKind ());
1523+ ASSERT_EQ (StringRef (" href" ), Toks[3 ].getHTMLIdent ());
1524+
1525+ ASSERT_EQ (tok::html_equals, Toks[4 ].getKind ());
1526+
1527+ ASSERT_EQ (tok::html_quoted_string, Toks[5 ].getKind ());
1528+ ASSERT_EQ (StringRef (" foo" ), Toks[5 ].getHTMLQuotedString ());
1529+
1530+ ASSERT_EQ (tok::html_ident, Toks[6 ].getKind ());
1531+ ASSERT_EQ (StringRef (" bar" ), Toks[6 ].getHTMLIdent ());
1532+
1533+ ASSERT_EQ (tok::html_greater, Toks[7 ].getKind ());
1534+
1535+ ASSERT_EQ (tok::text, Toks[8 ].getKind ());
1536+ ASSERT_EQ (StringRef (" text" ), Toks[8 ].getText ());
1537+
1538+ ASSERT_EQ (tok::html_end_tag, Toks[9 ].getKind ());
1539+ ASSERT_EQ (StringRef (" a" ), Toks[9 ].getHTMLTagEndName ());
1540+
1541+ ASSERT_EQ (tok::html_greater, Toks[10 ].getKind ());
1542+
1543+ ASSERT_EQ (tok::newline, Toks[11 ].getKind ());
1544+
1545+ ASSERT_EQ (tok::text, Toks[12 ].getKind ());
1546+ ASSERT_EQ (StringRef (" " ), Toks[12 ].getText ());
1547+
1548+ ASSERT_EQ (tok::newline, Toks[13 ].getKind ());
1549+
1550+ ASSERT_EQ (tok::newline, Toks[14 ].getKind ());
1551+ }
1552+
1553+ TEST_F (CommentLexerTest, HTML22) {
1554+ const char *Source = " /**\n "
1555+ " * <a\n "
1556+ " */" ;
1557+
1558+ std::vector<Token> Toks;
1559+
1560+ lexString (Source, Toks);
1561+
1562+ ASSERT_EQ (6U , Toks.size ());
1563+
1564+ ASSERT_EQ (tok::newline, Toks[0 ].getKind ());
1565+
1566+ ASSERT_EQ (tok::text, Toks[1 ].getKind ());
1567+ ASSERT_EQ (StringRef (" " ), Toks[1 ].getText ());
1568+
1569+ ASSERT_EQ (tok::html_start_tag, Toks[2 ].getKind ());
1570+ ASSERT_EQ (StringRef (" a" ), Toks[2 ].getHTMLTagStartName ());
1571+
1572+ ASSERT_EQ (tok::newline, Toks[3 ].getKind ());
1573+
1574+ ASSERT_EQ (tok::newline, Toks[4 ].getKind ());
1575+
1576+ ASSERT_EQ (tok::newline, Toks[5 ].getKind ());
1577+ }
1578+
1579+ TEST_F (CommentLexerTest, HTML23) {
1580+ // NOTE: "//<" is considered a comment start
1581+ const char *Source = " // <\n "
1582+ " // a\n "
1583+ " // >" ;
1584+
1585+ std::vector<Token> Toks;
1586+
1587+ lexString (Source, Toks);
1588+
1589+ ASSERT_EQ (7U , Toks.size ());
1590+
1591+ ASSERT_EQ (tok::text, Toks[0 ].getKind ());
1592+ ASSERT_EQ (StringRef (" " ), Toks[0 ].getText ());
1593+
1594+ ASSERT_EQ (tok::text, Toks[1 ].getKind ());
1595+ ASSERT_EQ (StringRef (" <" ), Toks[1 ].getText ());
1596+
1597+ ASSERT_EQ (tok::newline, Toks[2 ].getKind ());
1598+
1599+ ASSERT_EQ (tok::text, Toks[3 ].getKind ());
1600+ ASSERT_EQ (StringRef (" a" ), Toks[3 ].getText ());
1601+
1602+ ASSERT_EQ (tok::newline, Toks[4 ].getKind ());
1603+
1604+ ASSERT_EQ (tok::text, Toks[5 ].getKind ());
1605+ ASSERT_EQ (StringRef (" >" ), Toks[5 ].getText ());
1606+
1607+ ASSERT_EQ (tok::newline, Toks[6 ].getKind ());
1608+ }
1609+
14561610TEST_F (CommentLexerTest, NotAKnownHTMLTag1) {
14571611 const char *Source = " // <tag>" ;
14581612
0 commit comments