From f15646622a57e60280f859843435731622863a7b Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Mon, 8 Jan 2018 11:50:00 +0100 Subject: [PATCH 01/43] GLSL: Limit recovery attempts "switch(" was recovered with number, ), ), ), ... Task-number: QTCREATORBUG-18967 Change-Id: I12ccea0925fb2956de7405d9c8afea5dddeaf4f9 Reviewed-by: David Schulz Reviewed-by: Erik Verbruggen --- src/libs/glsl/glsl.g | 2 + src/libs/glsl/glslparser.cpp | 636 ++++---- src/libs/glsl/glslparsertable.cpp | 2507 ++++++++++++++--------------- src/libs/glsl/glslparsertable_p.h | 441 ++--- 4 files changed, 1796 insertions(+), 1790 deletions(-) diff --git a/src/libs/glsl/glsl.g b/src/libs/glsl/glsl.g index ccd80ae8f1a..314cef0bb70 100644 --- a/src/libs/glsl/glsl.g +++ b/src/libs/glsl/glsl.g @@ -569,6 +569,8 @@ AST *Parser::parse(int startToken) action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT); } else if (action == 0) { ++recoveryAttempts; + if (recoveryAttempts > 10) + break; const int line = _tokens[yyloc].line + 1; QString message = QLatin1String("Syntax error"); if (yytoken != -1) { diff --git a/src/libs/glsl/glslparser.cpp b/src/libs/glsl/glslparser.cpp index a746a6050b2..f435032999c 100644 --- a/src/libs/glsl/glslparser.cpp +++ b/src/libs/glsl/glslparser.cpp @@ -159,6 +159,8 @@ AST *Parser::parse(int startToken) action = nt_action(_stateStack[_tos], lhs[ruleno] - TERMINAL_COUNT); } else if (action == 0) { ++recoveryAttempts; + if (recoveryAttempts > 10) + break; const int line = _tokens[yyloc].line + 1; QString message = QLatin1String("Syntax error"); if (yytoken != -1) { @@ -225,137 +227,137 @@ AST *Parser::parse(int startToken) return 0; } -#line 641 "./glsl.g" +#line 643 "./glsl.g" void Parser::reduce(int ruleno) { switch(ruleno) { -#line 650 "./glsl.g" +#line 652 "./glsl.g" case 0: { ast(1) = makeAstNode(string(1)); } break; -#line 657 "./glsl.g" +#line 659 "./glsl.g" case 1: { ast(1) = makeAstNode(string(1)); } break; -#line 664 "./glsl.g" +#line 666 "./glsl.g" case 2: { ast(1) = makeAstNode(_engine->identifier("true", 4)); } break; -#line 671 "./glsl.g" +#line 673 "./glsl.g" case 3: { ast(1) = makeAstNode(_engine->identifier("false", 5)); } break; -#line 678 "./glsl.g" +#line 680 "./glsl.g" case 4: { // nothing to do. } break; -#line 685 "./glsl.g" +#line 687 "./glsl.g" case 5: { ast(1) = ast(2); } break; -#line 692 "./glsl.g" +#line 694 "./glsl.g" case 6: { // nothing to do. } break; -#line 699 "./glsl.g" +#line 701 "./glsl.g" case 7: { ast(1) = makeAstNode(AST::Kind_ArrayAccess, expression(1), expression(3)); } break; -#line 706 "./glsl.g" +#line 708 "./glsl.g" case 8: { // nothing to do. } break; -#line 713 "./glsl.g" +#line 715 "./glsl.g" case 9: { ast(1) = makeAstNode(expression(1), string(3)); } break; -#line 720 "./glsl.g" +#line 722 "./glsl.g" case 10: { ast(1) = makeAstNode(AST::Kind_PostIncrement, expression(1)); } break; -#line 727 "./glsl.g" +#line 729 "./glsl.g" case 11: { ast(1) = makeAstNode(AST::Kind_PostDecrement, expression(1)); } break; -#line 734 "./glsl.g" +#line 736 "./glsl.g" case 12: { // nothing to do. } break; -#line 741 "./glsl.g" +#line 743 "./glsl.g" case 13: { // nothing to do. } break; -#line 748 "./glsl.g" +#line 750 "./glsl.g" case 14: { ast(1) = makeAstNode (sym(1).function.id, sym(1).function.arguments); } break; -#line 756 "./glsl.g" +#line 758 "./glsl.g" case 15: { ast(1) = makeAstNode (expression(1), sym(3).function.id, sym(3).function.arguments); } break; -#line 764 "./glsl.g" +#line 766 "./glsl.g" case 16: { // nothing to do. } break; -#line 771 "./glsl.g" +#line 773 "./glsl.g" case 17: { // nothing to do. } break; -#line 778 "./glsl.g" +#line 780 "./glsl.g" case 18: { sym(1).function.id = sym(1).function_identifier; sym(1).function.arguments = 0; } break; -#line 786 "./glsl.g" +#line 788 "./glsl.g" case 19: { sym(1).function.id = sym(1).function_identifier; sym(1).function.arguments = 0; } break; -#line 794 "./glsl.g" +#line 796 "./glsl.g" case 20: { sym(1).function.id = sym(1).function_identifier; @@ -363,7 +365,7 @@ case 20: { makeAstNode< List >(expression(2)); } break; -#line 803 "./glsl.g" +#line 805 "./glsl.g" case 21: { sym(1).function.arguments = @@ -371,379 +373,379 @@ case 21: { (sym(1).function.arguments, expression(3)); } break; -#line 812 "./glsl.g" +#line 814 "./glsl.g" case 22: { // nothing to do. } break; -#line 819 "./glsl.g" +#line 821 "./glsl.g" case 23: { ast(1) = makeAstNode(type(1)); } break; -#line 826 "./glsl.g" +#line 828 "./glsl.g" case 24: { ast(1) = makeAstNode(string(1)); } break; -#line 833 "./glsl.g" +#line 835 "./glsl.g" case 25: { // nothing to do. } break; -#line 840 "./glsl.g" +#line 842 "./glsl.g" case 26: { ast(1) = makeAstNode(AST::Kind_PreIncrement, expression(2)); } break; -#line 847 "./glsl.g" +#line 849 "./glsl.g" case 27: { ast(1) = makeAstNode(AST::Kind_PreDecrement, expression(2)); } break; -#line 854 "./glsl.g" +#line 856 "./glsl.g" case 28: { ast(1) = makeAstNode(sym(1).kind, expression(2)); } break; -#line 861 "./glsl.g" +#line 863 "./glsl.g" case 29: { sym(1).kind = AST::Kind_UnaryPlus; } break; -#line 868 "./glsl.g" +#line 870 "./glsl.g" case 30: { sym(1).kind = AST::Kind_UnaryMinus; } break; -#line 875 "./glsl.g" +#line 877 "./glsl.g" case 31: { sym(1).kind = AST::Kind_LogicalNot; } break; -#line 882 "./glsl.g" +#line 884 "./glsl.g" case 32: { sym(1).kind = AST::Kind_BitwiseNot; } break; -#line 889 "./glsl.g" +#line 891 "./glsl.g" case 33: { // nothing to do. } break; -#line 896 "./glsl.g" +#line 898 "./glsl.g" case 34: { ast(1) = makeAstNode(AST::Kind_Multiply, expression(1), expression(3)); } break; -#line 903 "./glsl.g" +#line 905 "./glsl.g" case 35: { ast(1) = makeAstNode(AST::Kind_Divide, expression(1), expression(3)); } break; -#line 910 "./glsl.g" +#line 912 "./glsl.g" case 36: { ast(1) = makeAstNode(AST::Kind_Modulus, expression(1), expression(3)); } break; -#line 917 "./glsl.g" +#line 919 "./glsl.g" case 37: { // nothing to do. } break; -#line 924 "./glsl.g" +#line 926 "./glsl.g" case 38: { ast(1) = makeAstNode(AST::Kind_Plus, expression(1), expression(3)); } break; -#line 931 "./glsl.g" +#line 933 "./glsl.g" case 39: { ast(1) = makeAstNode(AST::Kind_Minus, expression(1), expression(3)); } break; -#line 938 "./glsl.g" +#line 940 "./glsl.g" case 40: { // nothing to do. } break; -#line 945 "./glsl.g" +#line 947 "./glsl.g" case 41: { ast(1) = makeAstNode(AST::Kind_ShiftLeft, expression(1), expression(3)); } break; -#line 952 "./glsl.g" +#line 954 "./glsl.g" case 42: { ast(1) = makeAstNode(AST::Kind_ShiftRight, expression(1), expression(3)); } break; -#line 959 "./glsl.g" +#line 961 "./glsl.g" case 43: { // nothing to do. } break; -#line 966 "./glsl.g" +#line 968 "./glsl.g" case 44: { ast(1) = makeAstNode(AST::Kind_LessThan, expression(1), expression(3)); } break; -#line 973 "./glsl.g" +#line 975 "./glsl.g" case 45: { ast(1) = makeAstNode(AST::Kind_GreaterThan, expression(1), expression(3)); } break; -#line 980 "./glsl.g" +#line 982 "./glsl.g" case 46: { ast(1) = makeAstNode(AST::Kind_LessEqual, expression(1), expression(3)); } break; -#line 987 "./glsl.g" +#line 989 "./glsl.g" case 47: { ast(1) = makeAstNode(AST::Kind_GreaterEqual, expression(1), expression(3)); } break; -#line 994 "./glsl.g" +#line 996 "./glsl.g" case 48: { // nothing to do. } break; -#line 1001 "./glsl.g" +#line 1003 "./glsl.g" case 49: { ast(1) = makeAstNode(AST::Kind_Equal, expression(1), expression(3)); } break; -#line 1008 "./glsl.g" +#line 1010 "./glsl.g" case 50: { ast(1) = makeAstNode(AST::Kind_NotEqual, expression(1), expression(3)); } break; -#line 1015 "./glsl.g" +#line 1017 "./glsl.g" case 51: { // nothing to do. } break; -#line 1022 "./glsl.g" +#line 1024 "./glsl.g" case 52: { ast(1) = makeAstNode(AST::Kind_BitwiseAnd, expression(1), expression(3)); } break; -#line 1029 "./glsl.g" +#line 1031 "./glsl.g" case 53: { // nothing to do. } break; -#line 1036 "./glsl.g" +#line 1038 "./glsl.g" case 54: { ast(1) = makeAstNode(AST::Kind_BitwiseXor, expression(1), expression(3)); } break; -#line 1043 "./glsl.g" +#line 1045 "./glsl.g" case 55: { // nothing to do. } break; -#line 1050 "./glsl.g" +#line 1052 "./glsl.g" case 56: { ast(1) = makeAstNode(AST::Kind_BitwiseOr, expression(1), expression(3)); } break; -#line 1057 "./glsl.g" +#line 1059 "./glsl.g" case 57: { // nothing to do. } break; -#line 1064 "./glsl.g" +#line 1066 "./glsl.g" case 58: { ast(1) = makeAstNode(AST::Kind_LogicalAnd, expression(1), expression(3)); } break; -#line 1071 "./glsl.g" +#line 1073 "./glsl.g" case 59: { // nothing to do. } break; -#line 1078 "./glsl.g" +#line 1080 "./glsl.g" case 60: { ast(1) = makeAstNode(AST::Kind_LogicalXor, expression(1), expression(3)); } break; -#line 1085 "./glsl.g" +#line 1087 "./glsl.g" case 61: { // nothing to do. } break; -#line 1092 "./glsl.g" +#line 1094 "./glsl.g" case 62: { ast(1) = makeAstNode(AST::Kind_LogicalOr, expression(1), expression(3)); } break; -#line 1099 "./glsl.g" +#line 1101 "./glsl.g" case 63: { // nothing to do. } break; -#line 1106 "./glsl.g" +#line 1108 "./glsl.g" case 64: { ast(1) = makeAstNode(AST::Kind_Conditional, expression(1), expression(3), expression(5)); } break; -#line 1113 "./glsl.g" +#line 1115 "./glsl.g" case 65: { // nothing to do. } break; -#line 1120 "./glsl.g" +#line 1122 "./glsl.g" case 66: { ast(1) = makeAstNode(sym(2).kind, expression(1), expression(3)); } break; -#line 1127 "./glsl.g" +#line 1129 "./glsl.g" case 67: { sym(1).kind = AST::Kind_Assign; } break; -#line 1134 "./glsl.g" +#line 1136 "./glsl.g" case 68: { sym(1).kind = AST::Kind_AssignMultiply; } break; -#line 1141 "./glsl.g" +#line 1143 "./glsl.g" case 69: { sym(1).kind = AST::Kind_AssignDivide; } break; -#line 1148 "./glsl.g" +#line 1150 "./glsl.g" case 70: { sym(1).kind = AST::Kind_AssignModulus; } break; -#line 1155 "./glsl.g" +#line 1157 "./glsl.g" case 71: { sym(1).kind = AST::Kind_AssignPlus; } break; -#line 1162 "./glsl.g" +#line 1164 "./glsl.g" case 72: { sym(1).kind = AST::Kind_AssignMinus; } break; -#line 1169 "./glsl.g" +#line 1171 "./glsl.g" case 73: { sym(1).kind = AST::Kind_AssignShiftLeft; } break; -#line 1176 "./glsl.g" +#line 1178 "./glsl.g" case 74: { sym(1).kind = AST::Kind_AssignShiftRight; } break; -#line 1183 "./glsl.g" +#line 1185 "./glsl.g" case 75: { sym(1).kind = AST::Kind_AssignAnd; } break; -#line 1190 "./glsl.g" +#line 1192 "./glsl.g" case 76: { sym(1).kind = AST::Kind_AssignXor; } break; -#line 1197 "./glsl.g" +#line 1199 "./glsl.g" case 77: { sym(1).kind = AST::Kind_AssignOr; } break; -#line 1204 "./glsl.g" +#line 1206 "./glsl.g" case 78: { // nothing to do. } break; -#line 1211 "./glsl.g" +#line 1213 "./glsl.g" case 79: { ast(1) = makeAstNode(AST::Kind_Comma, expression(1), expression(3)); } break; -#line 1218 "./glsl.g" +#line 1220 "./glsl.g" case 80: { // nothing to do. } break; -#line 1225 "./glsl.g" +#line 1227 "./glsl.g" case 81: { // nothing to do. } break; -#line 1232 "./glsl.g" +#line 1234 "./glsl.g" case 82: { ast(1) = makeAstNode(sym(1).declaration_list); } break; -#line 1239 "./glsl.g" +#line 1241 "./glsl.g" case 83: { ast(1) = makeAstNode(sym(2).precision, type(3)); } break; -#line 1246 "./glsl.g" +#line 1248 "./glsl.g" case 84: { if (sym(1).type_qualifier.qualifier != QualifiedTypeAST::Struct) { @@ -753,7 +755,7 @@ case 84: { ast(1) = makeAstNode(type); } break; -#line 1257 "./glsl.g" +#line 1259 "./glsl.g" case 85: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -771,7 +773,7 @@ case 85: { makeAstNode(qualtype, string(6))); } break; -#line 1276 "./glsl.g" +#line 1278 "./glsl.g" case 86: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -790,7 +792,7 @@ case 86: { (makeAstNode(qualtype), string(6))); } break; -#line 1296 "./glsl.g" +#line 1298 "./glsl.g" case 87: { if ((sym(1).type_qualifier.qualifier & QualifiedTypeAST::Struct) == 0) { @@ -809,7 +811,7 @@ case 87: { (makeAstNode(qualtype, expression(8)), string(6))); } break; -#line 1316 "./glsl.g" +#line 1318 "./glsl.g" case 88: { TypeAST *type = makeAstNode @@ -818,59 +820,59 @@ case 88: { ast(1) = makeAstNode(type); } break; -#line 1326 "./glsl.g" +#line 1328 "./glsl.g" case 89: { function(1)->finishParams(); } break; -#line 1333 "./glsl.g" +#line 1335 "./glsl.g" case 90: { // nothing to do. } break; -#line 1340 "./glsl.g" +#line 1342 "./glsl.g" case 91: { // nothing to do. } break; -#line 1347 "./glsl.g" +#line 1349 "./glsl.g" case 92: { function(1)->params = makeAstNode< List > (sym(2).param_declaration); } break; -#line 1355 "./glsl.g" +#line 1357 "./glsl.g" case 93: { function(1)->params = makeAstNode< List > (function(1)->params, sym(3).param_declaration); } break; -#line 1363 "./glsl.g" +#line 1365 "./glsl.g" case 94: { function(1) = makeAstNode(type(1), string(2)); } break; -#line 1370 "./glsl.g" +#line 1372 "./glsl.g" case 95: { sym(1).param_declarator.type = type(1); sym(1).param_declarator.name = string(2); } break; -#line 1378 "./glsl.g" +#line 1380 "./glsl.g" case 96: { sym(1).param_declarator.type = makeAstNode(type(1), expression(4)); sym(1).param_declarator.name = string(2); } break; -#line 1386 "./glsl.g" +#line 1388 "./glsl.g" case 97: { ast(1) = makeAstNode @@ -881,7 +883,7 @@ case 97: { sym(3).param_declarator.name); } break; -#line 1398 "./glsl.g" +#line 1400 "./glsl.g" case 98: { ast(1) = makeAstNode @@ -890,7 +892,7 @@ case 98: { sym(2).param_declarator.name); } break; -#line 1408 "./glsl.g" +#line 1410 "./glsl.g" case 99: { ast(1) = makeAstNode @@ -900,7 +902,7 @@ case 99: { (const QString *)0); } break; -#line 1419 "./glsl.g" +#line 1421 "./glsl.g" case 100: { ast(1) = makeAstNode @@ -908,44 +910,44 @@ case 100: { (const QString *)0); } break; -#line 1428 "./glsl.g" +#line 1430 "./glsl.g" case 101: { sym(1).qualifier = ParameterDeclarationAST::In; } break; -#line 1435 "./glsl.g" +#line 1437 "./glsl.g" case 102: { sym(1).qualifier = ParameterDeclarationAST::In; } break; -#line 1442 "./glsl.g" +#line 1444 "./glsl.g" case 103: { sym(1).qualifier = ParameterDeclarationAST::Out; } break; -#line 1449 "./glsl.g" +#line 1451 "./glsl.g" case 104: { sym(1).qualifier = ParameterDeclarationAST::InOut; } break; -#line 1456 "./glsl.g" +#line 1458 "./glsl.g" case 105: { // nothing to do. } break; -#line 1463 "./glsl.g" +#line 1465 "./glsl.g" case 106: { sym(1).declaration_list = makeAstNode< List > (sym(1).declaration); } break; -#line 1471 "./glsl.g" +#line 1473 "./glsl.g" case 107: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -954,7 +956,7 @@ case 107: { (sym(1).declaration_list, decl); } break; -#line 1481 "./glsl.g" +#line 1483 "./glsl.g" case 108: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -964,7 +966,7 @@ case 108: { (sym(1).declaration_list, decl); } break; -#line 1492 "./glsl.g" +#line 1494 "./glsl.g" case 109: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -974,7 +976,7 @@ case 109: { (sym(1).declaration_list, decl); } break; -#line 1503 "./glsl.g" +#line 1505 "./glsl.g" case 110: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -985,7 +987,7 @@ case 110: { (sym(1).declaration_list, decl); } break; -#line 1515 "./glsl.g" +#line 1517 "./glsl.g" case 111: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -996,7 +998,7 @@ case 111: { (sym(1).declaration_list, decl); } break; -#line 1527 "./glsl.g" +#line 1529 "./glsl.g" case 112: { TypeAST *type = VariableDeclarationAST::declarationType(sym(1).declaration_list); @@ -1006,40 +1008,40 @@ case 112: { (sym(1).declaration_list, decl); } break; -#line 1538 "./glsl.g" +#line 1540 "./glsl.g" case 113: { ast(1) = makeAstNode(type(1)); } break; -#line 1545 "./glsl.g" +#line 1547 "./glsl.g" case 114: { ast(1) = makeAstNode(type(1), string(2)); } break; -#line 1552 "./glsl.g" +#line 1554 "./glsl.g" case 115: { ast(1) = makeAstNode (makeAstNode(type(1)), string(2)); } break; -#line 1560 "./glsl.g" +#line 1562 "./glsl.g" case 116: { ast(1) = makeAstNode (makeAstNode(type(1), expression(4)), string(2)); } break; -#line 1568 "./glsl.g" +#line 1570 "./glsl.g" case 117: { ast(1) = makeAstNode (makeAstNode(type(1)), string(2), expression(6)); } break; -#line 1576 "./glsl.g" +#line 1578 "./glsl.g" case 118: { ast(1) = makeAstNode @@ -1047,26 +1049,26 @@ case 118: { string(2), expression(7)); } break; -#line 1585 "./glsl.g" +#line 1587 "./glsl.g" case 119: { ast(1) = makeAstNode (type(1), string(2), expression(4)); } break; -#line 1593 "./glsl.g" +#line 1595 "./glsl.g" case 120: { ast(1) = makeAstNode(string(2)); } break; -#line 1600 "./glsl.g" +#line 1602 "./glsl.g" case 121: { ast(1) = makeAstNode(0, type(1), (List *)0); } break; -#line 1607 "./glsl.g" +#line 1609 "./glsl.g" case 122: { ast(1) = makeAstNode @@ -1074,207 +1076,207 @@ case 122: { sym(1).type_qualifier.layout_list); } break; -#line 1616 "./glsl.g" +#line 1618 "./glsl.g" case 123: { sym(1).qualifier = QualifiedTypeAST::Invariant; } break; -#line 1623 "./glsl.g" +#line 1625 "./glsl.g" case 124: { sym(1).qualifier = QualifiedTypeAST::Smooth; } break; -#line 1630 "./glsl.g" +#line 1632 "./glsl.g" case 125: { sym(1).qualifier = QualifiedTypeAST::Flat; } break; -#line 1637 "./glsl.g" +#line 1639 "./glsl.g" case 126: { sym(1).qualifier = QualifiedTypeAST::NoPerspective; } break; -#line 1644 "./glsl.g" +#line 1646 "./glsl.g" case 127: { sym(1) = sym(3); } break; -#line 1651 "./glsl.g" +#line 1653 "./glsl.g" case 128: { sym(1).layout_list = makeAstNode< List >(sym(1).layout); } break; -#line 1658 "./glsl.g" +#line 1660 "./glsl.g" case 129: { sym(1).layout_list = makeAstNode< List >(sym(1).layout_list, sym(3).layout); } break; -#line 1665 "./glsl.g" +#line 1667 "./glsl.g" case 130: { sym(1).layout = makeAstNode(string(1), (const QString *)0); } break; -#line 1672 "./glsl.g" +#line 1674 "./glsl.g" case 131: { sym(1).layout = makeAstNode(string(1), string(3)); } break; -#line 1679 "./glsl.g" +#line 1681 "./glsl.g" case 132: { sym(1).qualifier = QualifiedTypeAST::Const; } break; -#line 1686 "./glsl.g" +#line 1688 "./glsl.g" case 133: { sym(1).type_qualifier.qualifier = sym(1).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1694 "./glsl.g" +#line 1696 "./glsl.g" case 134: { sym(1).type_qualifier.layout_list = sym(1).layout_list; sym(1).type_qualifier.qualifier = 0; } break; -#line 1702 "./glsl.g" +#line 1704 "./glsl.g" case 135: { sym(1).type_qualifier.layout_list = sym(1).layout_list; sym(1).type_qualifier.qualifier = sym(2).qualifier; } break; -#line 1710 "./glsl.g" +#line 1712 "./glsl.g" case 136: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1718 "./glsl.g" +#line 1720 "./glsl.g" case 137: { sym(1).type_qualifier.qualifier = sym(1).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1726 "./glsl.g" +#line 1728 "./glsl.g" case 138: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1734 "./glsl.g" +#line 1736 "./glsl.g" case 139: { sym(1).type_qualifier.qualifier = sym(1).qualifier | sym(2).qualifier | sym(3).qualifier; sym(1).type_qualifier.layout_list = 0; } break; -#line 1742 "./glsl.g" +#line 1744 "./glsl.g" case 140: { sym(1).type_qualifier.qualifier = QualifiedTypeAST::Invariant; sym(1).type_qualifier.layout_list = 0; } break; -#line 1750 "./glsl.g" +#line 1752 "./glsl.g" case 141: { sym(1).qualifier = QualifiedTypeAST::Const; } break; -#line 1757 "./glsl.g" +#line 1759 "./glsl.g" case 142: { sym(1).qualifier = QualifiedTypeAST::Attribute; } break; -#line 1764 "./glsl.g" +#line 1766 "./glsl.g" case 143: { sym(1).qualifier = QualifiedTypeAST::Varying; } break; -#line 1771 "./glsl.g" +#line 1773 "./glsl.g" case 144: { sym(1).qualifier = QualifiedTypeAST::CentroidVarying; } break; -#line 1778 "./glsl.g" +#line 1780 "./glsl.g" case 145: { sym(1).qualifier = QualifiedTypeAST::In; } break; -#line 1785 "./glsl.g" +#line 1787 "./glsl.g" case 146: { sym(1).qualifier = QualifiedTypeAST::Out; } break; -#line 1792 "./glsl.g" +#line 1794 "./glsl.g" case 147: { sym(1).qualifier = QualifiedTypeAST::CentroidIn; } break; -#line 1799 "./glsl.g" +#line 1801 "./glsl.g" case 148: { sym(1).qualifier = QualifiedTypeAST::CentroidOut; } break; -#line 1806 "./glsl.g" +#line 1808 "./glsl.g" case 149: { sym(1).qualifier = QualifiedTypeAST::PatchIn; } break; -#line 1813 "./glsl.g" +#line 1815 "./glsl.g" case 150: { sym(1).qualifier = QualifiedTypeAST::PatchOut; } break; -#line 1820 "./glsl.g" +#line 1822 "./glsl.g" case 151: { sym(1).qualifier = QualifiedTypeAST::SampleIn; } break; -#line 1827 "./glsl.g" +#line 1829 "./glsl.g" case 152: { sym(1).qualifier = QualifiedTypeAST::SampleOut; } break; -#line 1834 "./glsl.g" +#line 1836 "./glsl.g" case 153: { sym(1).qualifier = QualifiedTypeAST::Uniform; } break; -#line 1841 "./glsl.g" +#line 1843 "./glsl.g" case 154: { // nothing to do. } break; -#line 1848 "./glsl.g" +#line 1850 "./glsl.g" case 155: { if (!type(2)->setPrecision(sym(1).precision)) { @@ -1283,595 +1285,595 @@ case 155: { ast(1) = type(2); } break; -#line 1858 "./glsl.g" +#line 1860 "./glsl.g" case 156: { // nothing to do. } break; -#line 1865 "./glsl.g" +#line 1867 "./glsl.g" case 157: { ast(1) = makeAstNode(type(1)); } break; -#line 1872 "./glsl.g" +#line 1874 "./glsl.g" case 158: { ast(1) = makeAstNode(type(1), expression(3)); } break; -#line 1879 "./glsl.g" +#line 1881 "./glsl.g" case 159: { ast(1) = makeBasicType(T_VOID); } break; -#line 1886 "./glsl.g" +#line 1888 "./glsl.g" case 160: { ast(1) = makeBasicType(T_FLOAT); } break; -#line 1893 "./glsl.g" +#line 1895 "./glsl.g" case 161: { ast(1) = makeBasicType(T_DOUBLE); } break; -#line 1900 "./glsl.g" +#line 1902 "./glsl.g" case 162: { ast(1) = makeBasicType(T_INT); } break; -#line 1907 "./glsl.g" +#line 1909 "./glsl.g" case 163: { ast(1) = makeBasicType(T_UINT); } break; -#line 1914 "./glsl.g" +#line 1916 "./glsl.g" case 164: { ast(1) = makeBasicType(T_BOOL); } break; -#line 1921 "./glsl.g" +#line 1923 "./glsl.g" case 165: { ast(1) = makeBasicType(T_VEC2); } break; -#line 1928 "./glsl.g" +#line 1930 "./glsl.g" case 166: { ast(1) = makeBasicType(T_VEC3); } break; -#line 1935 "./glsl.g" +#line 1937 "./glsl.g" case 167: { ast(1) = makeBasicType(T_VEC4); } break; -#line 1942 "./glsl.g" +#line 1944 "./glsl.g" case 168: { ast(1) = makeBasicType(T_DVEC2); } break; -#line 1949 "./glsl.g" +#line 1951 "./glsl.g" case 169: { ast(1) = makeBasicType(T_DVEC3); } break; -#line 1956 "./glsl.g" +#line 1958 "./glsl.g" case 170: { ast(1) = makeBasicType(T_DVEC4); } break; -#line 1963 "./glsl.g" +#line 1965 "./glsl.g" case 171: { ast(1) = makeBasicType(T_BVEC2); } break; -#line 1970 "./glsl.g" +#line 1972 "./glsl.g" case 172: { ast(1) = makeBasicType(T_BVEC3); } break; -#line 1977 "./glsl.g" +#line 1979 "./glsl.g" case 173: { ast(1) = makeBasicType(T_BVEC4); } break; -#line 1984 "./glsl.g" +#line 1986 "./glsl.g" case 174: { ast(1) = makeBasicType(T_IVEC2); } break; -#line 1991 "./glsl.g" +#line 1993 "./glsl.g" case 175: { ast(1) = makeBasicType(T_IVEC3); } break; -#line 1998 "./glsl.g" +#line 2000 "./glsl.g" case 176: { ast(1) = makeBasicType(T_IVEC4); } break; -#line 2005 "./glsl.g" +#line 2007 "./glsl.g" case 177: { ast(1) = makeBasicType(T_UVEC2); } break; -#line 2012 "./glsl.g" +#line 2014 "./glsl.g" case 178: { ast(1) = makeBasicType(T_UVEC3); } break; -#line 2019 "./glsl.g" +#line 2021 "./glsl.g" case 179: { ast(1) = makeBasicType(T_UVEC4); } break; -#line 2026 "./glsl.g" +#line 2028 "./glsl.g" case 180: { ast(1) = makeBasicType(T_MAT2); } break; -#line 2033 "./glsl.g" +#line 2035 "./glsl.g" case 181: { ast(1) = makeBasicType(T_MAT3); } break; -#line 2040 "./glsl.g" +#line 2042 "./glsl.g" case 182: { ast(1) = makeBasicType(T_MAT4); } break; -#line 2047 "./glsl.g" +#line 2049 "./glsl.g" case 183: { ast(1) = makeBasicType(T_MAT2); } break; -#line 2054 "./glsl.g" +#line 2056 "./glsl.g" case 184: { ast(1) = makeBasicType(T_MAT2X3); } break; -#line 2061 "./glsl.g" +#line 2063 "./glsl.g" case 185: { ast(1) = makeBasicType(T_MAT2X4); } break; -#line 2068 "./glsl.g" +#line 2070 "./glsl.g" case 186: { ast(1) = makeBasicType(T_MAT3X2); } break; -#line 2075 "./glsl.g" +#line 2077 "./glsl.g" case 187: { ast(1) = makeBasicType(T_MAT3); } break; -#line 2082 "./glsl.g" +#line 2084 "./glsl.g" case 188: { ast(1) = makeBasicType(T_MAT3X4); } break; -#line 2089 "./glsl.g" +#line 2091 "./glsl.g" case 189: { ast(1) = makeBasicType(T_MAT4X2); } break; -#line 2096 "./glsl.g" +#line 2098 "./glsl.g" case 190: { ast(1) = makeBasicType(T_MAT4X3); } break; -#line 2103 "./glsl.g" +#line 2105 "./glsl.g" case 191: { ast(1) = makeBasicType(T_MAT4); } break; -#line 2110 "./glsl.g" +#line 2112 "./glsl.g" case 192: { ast(1) = makeBasicType(T_DMAT2); } break; -#line 2117 "./glsl.g" +#line 2119 "./glsl.g" case 193: { ast(1) = makeBasicType(T_DMAT3); } break; -#line 2124 "./glsl.g" +#line 2126 "./glsl.g" case 194: { ast(1) = makeBasicType(T_DMAT4); } break; -#line 2131 "./glsl.g" +#line 2133 "./glsl.g" case 195: { ast(1) = makeBasicType(T_DMAT2); } break; -#line 2138 "./glsl.g" +#line 2140 "./glsl.g" case 196: { ast(1) = makeBasicType(T_DMAT2X3); } break; -#line 2145 "./glsl.g" +#line 2147 "./glsl.g" case 197: { ast(1) = makeBasicType(T_DMAT2X4); } break; -#line 2152 "./glsl.g" +#line 2154 "./glsl.g" case 198: { ast(1) = makeBasicType(T_DMAT3X2); } break; -#line 2159 "./glsl.g" +#line 2161 "./glsl.g" case 199: { ast(1) = makeBasicType(T_DMAT3); } break; -#line 2166 "./glsl.g" +#line 2168 "./glsl.g" case 200: { ast(1) = makeBasicType(T_DMAT3X4); } break; -#line 2173 "./glsl.g" +#line 2175 "./glsl.g" case 201: { ast(1) = makeBasicType(T_DMAT4X2); } break; -#line 2180 "./glsl.g" +#line 2182 "./glsl.g" case 202: { ast(1) = makeBasicType(T_DMAT4X3); } break; -#line 2187 "./glsl.g" +#line 2189 "./glsl.g" case 203: { ast(1) = makeBasicType(T_DMAT4); } break; -#line 2194 "./glsl.g" +#line 2196 "./glsl.g" case 204: { ast(1) = makeBasicType(T_SAMPLER1D); } break; -#line 2201 "./glsl.g" +#line 2203 "./glsl.g" case 205: { ast(1) = makeBasicType(T_SAMPLER2D); } break; -#line 2208 "./glsl.g" +#line 2210 "./glsl.g" case 206: { ast(1) = makeBasicType(T_SAMPLER3D); } break; -#line 2215 "./glsl.g" +#line 2217 "./glsl.g" case 207: { ast(1) = makeBasicType(T_SAMPLERCUBE); } break; -#line 2222 "./glsl.g" +#line 2224 "./glsl.g" case 208: { ast(1) = makeBasicType(T_SAMPLER1DSHADOW); } break; -#line 2229 "./glsl.g" +#line 2231 "./glsl.g" case 209: { ast(1) = makeBasicType(T_SAMPLER2DSHADOW); } break; -#line 2236 "./glsl.g" +#line 2238 "./glsl.g" case 210: { ast(1) = makeBasicType(T_SAMPLERCUBESHADOW); } break; -#line 2243 "./glsl.g" +#line 2245 "./glsl.g" case 211: { ast(1) = makeBasicType(T_SAMPLER1DARRAY); } break; -#line 2250 "./glsl.g" +#line 2252 "./glsl.g" case 212: { ast(1) = makeBasicType(T_SAMPLER2DARRAY); } break; -#line 2257 "./glsl.g" +#line 2259 "./glsl.g" case 213: { ast(1) = makeBasicType(T_SAMPLER1DARRAYSHADOW); } break; -#line 2264 "./glsl.g" +#line 2266 "./glsl.g" case 214: { ast(1) = makeBasicType(T_SAMPLER2DARRAYSHADOW); } break; -#line 2271 "./glsl.g" +#line 2273 "./glsl.g" case 215: { ast(1) = makeBasicType(T_SAMPLERCUBEARRAY); } break; -#line 2278 "./glsl.g" +#line 2280 "./glsl.g" case 216: { ast(1) = makeBasicType(T_SAMPLERCUBEARRAYSHADOW); } break; -#line 2285 "./glsl.g" +#line 2287 "./glsl.g" case 217: { ast(1) = makeBasicType(T_ISAMPLER1D); } break; -#line 2292 "./glsl.g" +#line 2294 "./glsl.g" case 218: { ast(1) = makeBasicType(T_ISAMPLER2D); } break; -#line 2299 "./glsl.g" +#line 2301 "./glsl.g" case 219: { ast(1) = makeBasicType(T_ISAMPLER3D); } break; -#line 2306 "./glsl.g" +#line 2308 "./glsl.g" case 220: { ast(1) = makeBasicType(T_ISAMPLERCUBE); } break; -#line 2313 "./glsl.g" +#line 2315 "./glsl.g" case 221: { ast(1) = makeBasicType(T_ISAMPLER1DARRAY); } break; -#line 2320 "./glsl.g" +#line 2322 "./glsl.g" case 222: { ast(1) = makeBasicType(T_ISAMPLER2DARRAY); } break; -#line 2327 "./glsl.g" +#line 2329 "./glsl.g" case 223: { ast(1) = makeBasicType(T_ISAMPLERCUBEARRAY); } break; -#line 2334 "./glsl.g" +#line 2336 "./glsl.g" case 224: { ast(1) = makeBasicType(T_USAMPLER1D); } break; -#line 2341 "./glsl.g" +#line 2343 "./glsl.g" case 225: { ast(1) = makeBasicType(T_USAMPLER2D); } break; -#line 2348 "./glsl.g" +#line 2350 "./glsl.g" case 226: { ast(1) = makeBasicType(T_USAMPLER3D); } break; -#line 2355 "./glsl.g" +#line 2357 "./glsl.g" case 227: { ast(1) = makeBasicType(T_USAMPLERCUBE); } break; -#line 2362 "./glsl.g" +#line 2364 "./glsl.g" case 228: { ast(1) = makeBasicType(T_USAMPLER1DARRAY); } break; -#line 2369 "./glsl.g" +#line 2371 "./glsl.g" case 229: { ast(1) = makeBasicType(T_USAMPLER2DARRAY); } break; -#line 2376 "./glsl.g" +#line 2378 "./glsl.g" case 230: { ast(1) = makeBasicType(T_USAMPLERCUBEARRAY); } break; -#line 2383 "./glsl.g" +#line 2385 "./glsl.g" case 231: { ast(1) = makeBasicType(T_SAMPLER2DRECT); } break; -#line 2390 "./glsl.g" +#line 2392 "./glsl.g" case 232: { ast(1) = makeBasicType(T_SAMPLER2DRECTSHADOW); } break; -#line 2397 "./glsl.g" +#line 2399 "./glsl.g" case 233: { ast(1) = makeBasicType(T_ISAMPLER2DRECT); } break; -#line 2404 "./glsl.g" +#line 2406 "./glsl.g" case 234: { ast(1) = makeBasicType(T_USAMPLER2DRECT); } break; -#line 2411 "./glsl.g" +#line 2413 "./glsl.g" case 235: { ast(1) = makeBasicType(T_SAMPLERBUFFER); } break; -#line 2418 "./glsl.g" +#line 2420 "./glsl.g" case 236: { ast(1) = makeBasicType(T_ISAMPLERBUFFER); } break; -#line 2425 "./glsl.g" +#line 2427 "./glsl.g" case 237: { ast(1) = makeBasicType(T_USAMPLERBUFFER); } break; -#line 2432 "./glsl.g" +#line 2434 "./glsl.g" case 238: { ast(1) = makeBasicType(T_SAMPLER2DMS); } break; -#line 2439 "./glsl.g" +#line 2441 "./glsl.g" case 239: { ast(1) = makeBasicType(T_ISAMPLER2DMS); } break; -#line 2446 "./glsl.g" +#line 2448 "./glsl.g" case 240: { ast(1) = makeBasicType(T_USAMPLER2DMS); } break; -#line 2453 "./glsl.g" +#line 2455 "./glsl.g" case 241: { ast(1) = makeBasicType(T_SAMPLER2DMSARRAY); } break; -#line 2460 "./glsl.g" +#line 2462 "./glsl.g" case 242: { ast(1) = makeBasicType(T_ISAMPLER2DMSARRAY); } break; -#line 2467 "./glsl.g" +#line 2469 "./glsl.g" case 243: { ast(1) = makeBasicType(T_USAMPLER2DMSARRAY); } break; -#line 2474 "./glsl.g" +#line 2476 "./glsl.g" case 244: { // nothing to do. } break; -#line 2481 "./glsl.g" +#line 2483 "./glsl.g" case 245: { ast(1) = makeAstNode(string(1)); } break; -#line 2488 "./glsl.g" +#line 2490 "./glsl.g" case 246: { sym(1).precision = TypeAST::Highp; } break; -#line 2495 "./glsl.g" +#line 2497 "./glsl.g" case 247: { sym(1).precision = TypeAST::Mediump; } break; -#line 2502 "./glsl.g" +#line 2504 "./glsl.g" case 248: { sym(1).precision = TypeAST::Lowp; } break; -#line 2509 "./glsl.g" +#line 2511 "./glsl.g" case 249: { ast(1) = makeAstNode(string(2), sym(4).field_list); } break; -#line 2516 "./glsl.g" +#line 2518 "./glsl.g" case 250: { ast(1) = makeAstNode(sym(3).field_list); } break; -#line 2523 "./glsl.g" +#line 2525 "./glsl.g" case 251: { // nothing to do. } break; -#line 2530 "./glsl.g" +#line 2532 "./glsl.g" case 252: { sym(1).field_list = appendLists(sym(1).field_list, sym(2).field_list); } break; -#line 2537 "./glsl.g" +#line 2539 "./glsl.g" case 253: { sym(1).field_list = StructTypeAST::fixInnerTypes(type(1), sym(2).field_list); } break; -#line 2544 "./glsl.g" +#line 2546 "./glsl.g" case 254: { sym(1).field_list = StructTypeAST::fixInnerTypes @@ -1880,106 +1882,106 @@ case 254: { sym(1).type_qualifier.layout_list), sym(3).field_list); } break; -#line 2554 "./glsl.g" +#line 2556 "./glsl.g" case 255: { // nothing to do. sym(1).field_list = makeAstNode< List >(sym(1).field); } break; -#line 2562 "./glsl.g" +#line 2564 "./glsl.g" case 256: { sym(1).field_list = makeAstNode< List >(sym(1).field_list, sym(3).field); } break; -#line 2569 "./glsl.g" +#line 2571 "./glsl.g" case 257: { sym(1).field = makeAstNode(string(1)); } break; -#line 2576 "./glsl.g" +#line 2578 "./glsl.g" case 258: { sym(1).field = makeAstNode (string(1), makeAstNode((TypeAST *)0)); } break; -#line 2584 "./glsl.g" +#line 2586 "./glsl.g" case 259: { sym(1).field = makeAstNode (string(1), makeAstNode((TypeAST *)0, expression(3))); } break; -#line 2592 "./glsl.g" +#line 2594 "./glsl.g" case 260: { // nothing to do. } break; -#line 2599 "./glsl.g" +#line 2601 "./glsl.g" case 261: { ast(1) = makeAstNode(sym(1).declaration); } break; -#line 2606 "./glsl.g" +#line 2608 "./glsl.g" case 262: { // nothing to do. } break; -#line 2613 "./glsl.g" +#line 2615 "./glsl.g" case 263: { // nothing to do. } break; -#line 2620 "./glsl.g" +#line 2622 "./glsl.g" case 264: { // nothing to do. } break; -#line 2627 "./glsl.g" +#line 2629 "./glsl.g" case 265: { // nothing to do. } break; -#line 2634 "./glsl.g" +#line 2636 "./glsl.g" case 266: { // nothing to do. } break; -#line 2641 "./glsl.g" +#line 2643 "./glsl.g" case 267: { // nothing to do. } break; -#line 2648 "./glsl.g" +#line 2650 "./glsl.g" case 268: { // nothing to do. } break; -#line 2655 "./glsl.g" +#line 2657 "./glsl.g" case 269: { // nothing to do. } break; -#line 2662 "./glsl.g" +#line 2664 "./glsl.g" case 270: { // nothing to do. } break; -#line 2669 "./glsl.g" +#line 2671 "./glsl.g" case 271: { CompoundStatementAST *stmt = makeAstNode(); @@ -1988,7 +1990,7 @@ case 271: { ast(1) = stmt; } break; -#line 2679 "./glsl.g" +#line 2681 "./glsl.g" case 272: { CompoundStatementAST *stmt = makeAstNode(sym(2).statement_list); @@ -1997,19 +1999,19 @@ case 272: { ast(1) = stmt; } break; -#line 2689 "./glsl.g" +#line 2691 "./glsl.g" case 273: { // nothing to do. } break; -#line 2696 "./glsl.g" +#line 2698 "./glsl.g" case 274: { // nothing to do. } break; -#line 2703 "./glsl.g" +#line 2705 "./glsl.g" case 275: { CompoundStatementAST *stmt = makeAstNode(); @@ -2018,7 +2020,7 @@ case 275: { ast(1) = stmt; } break; -#line 2713 "./glsl.g" +#line 2715 "./glsl.g" case 276: { CompoundStatementAST *stmt = makeAstNode(sym(2).statement_list); @@ -2027,186 +2029,186 @@ case 276: { ast(1) = stmt; } break; -#line 2723 "./glsl.g" +#line 2725 "./glsl.g" case 277: { sym(1).statement_list = makeAstNode< List >(sym(1).statement); } break; -#line 2730 "./glsl.g" +#line 2732 "./glsl.g" case 278: { sym(1).statement_list = makeAstNode< List >(sym(1).statement_list, sym(2).statement); } break; -#line 2737 "./glsl.g" +#line 2739 "./glsl.g" case 279: { ast(1) = makeAstNode(); // Empty statement } break; -#line 2744 "./glsl.g" +#line 2746 "./glsl.g" case 280: { ast(1) = makeAstNode(expression(1)); } break; -#line 2751 "./glsl.g" +#line 2753 "./glsl.g" case 281: { ast(1) = makeAstNode(expression(3), sym(5).ifstmt.thenClause, sym(5).ifstmt.elseClause); } break; -#line 2758 "./glsl.g" +#line 2760 "./glsl.g" case 282: { sym(1).ifstmt.thenClause = statement(1); sym(1).ifstmt.elseClause = statement(3); } break; -#line 2766 "./glsl.g" +#line 2768 "./glsl.g" case 283: { sym(1).ifstmt.thenClause = statement(1); sym(1).ifstmt.elseClause = 0; } break; -#line 2774 "./glsl.g" +#line 2776 "./glsl.g" case 284: { // nothing to do. } break; -#line 2781 "./glsl.g" +#line 2783 "./glsl.g" case 285: { ast(1) = makeAstNode (type(1), string(2), expression(4)); } break; -#line 2789 "./glsl.g" +#line 2791 "./glsl.g" case 286: { ast(1) = makeAstNode(expression(3), statement(6)); } break; -#line 2796 "./glsl.g" +#line 2798 "./glsl.g" case 287: { ast(1) = makeAstNode(); } break; -#line 2803 "./glsl.g" +#line 2805 "./glsl.g" case 288: { ast(1) = makeAstNode(sym(1).statement_list); } break; -#line 2810 "./glsl.g" +#line 2812 "./glsl.g" case 289: { ast(1) = makeAstNode(expression(2)); } break; -#line 2817 "./glsl.g" +#line 2819 "./glsl.g" case 290: { ast(1) = makeAstNode(); } break; -#line 2824 "./glsl.g" +#line 2826 "./glsl.g" case 291: { ast(1) = makeAstNode(expression(3), statement(5)); } break; -#line 2831 "./glsl.g" +#line 2833 "./glsl.g" case 292: { ast(1) = makeAstNode(statement(2), expression(5)); } break; -#line 2838 "./glsl.g" +#line 2840 "./glsl.g" case 293: { ast(1) = makeAstNode(statement(3), sym(4).forstmt.condition, sym(4).forstmt.increment, statement(6)); } break; -#line 2845 "./glsl.g" +#line 2847 "./glsl.g" case 294: { // nothing to do. } break; -#line 2852 "./glsl.g" +#line 2854 "./glsl.g" case 295: { // nothing to do. } break; -#line 2859 "./glsl.g" +#line 2861 "./glsl.g" case 296: { // nothing to do. } break; -#line 2866 "./glsl.g" +#line 2868 "./glsl.g" case 297: { // nothing to do. } break; -#line 2873 "./glsl.g" +#line 2875 "./glsl.g" case 298: { sym(1).forstmt.condition = expression(1); sym(1).forstmt.increment = 0; } break; -#line 2881 "./glsl.g" +#line 2883 "./glsl.g" case 299: { sym(1).forstmt.condition = expression(1); sym(1).forstmt.increment = expression(3); } break; -#line 2889 "./glsl.g" +#line 2891 "./glsl.g" case 300: { ast(1) = makeAstNode(AST::Kind_Continue); } break; -#line 2896 "./glsl.g" +#line 2898 "./glsl.g" case 301: { ast(1) = makeAstNode(AST::Kind_Break); } break; -#line 2903 "./glsl.g" +#line 2905 "./glsl.g" case 302: { ast(1) = makeAstNode(); } break; -#line 2910 "./glsl.g" +#line 2912 "./glsl.g" case 303: { ast(1) = makeAstNode(expression(2)); } break; -#line 2917 "./glsl.g" +#line 2919 "./glsl.g" case 304: { ast(1) = makeAstNode(AST::Kind_Discard); } break; -#line 2924 "./glsl.g" +#line 2926 "./glsl.g" case 305: { ast(1) = makeAstNode(sym(1).declaration_list); } break; -#line 2931 "./glsl.g" +#line 2933 "./glsl.g" case 306: { if (sym(1).declaration) { @@ -2217,7 +2219,7 @@ case 306: { } } break; -#line 2943 "./glsl.g" +#line 2945 "./glsl.g" case 307: { if (sym(1).declaration_list && sym(2).declaration) { @@ -2233,49 +2235,49 @@ case 307: { } } break; -#line 2960 "./glsl.g" +#line 2962 "./glsl.g" case 308: { // nothing to do. } break; -#line 2967 "./glsl.g" +#line 2969 "./glsl.g" case 309: { // nothing to do. } break; -#line 2974 "./glsl.g" +#line 2976 "./glsl.g" case 310: { ast(1) = 0; } break; -#line 2981 "./glsl.g" +#line 2983 "./glsl.g" case 311: { function(1)->body = statement(2); } break; -#line 2988 "./glsl.g" +#line 2990 "./glsl.g" case 312: { ast(1) = 0; } break; -#line 2996 "./glsl.g" +#line 2998 "./glsl.g" case 313: { ast(1) = ast(2); } break; -#line 3003 "./glsl.g" +#line 3005 "./glsl.g" case 314: { ast(1) = ast(2); } break; -#line 3009 "./glsl.g" +#line 3011 "./glsl.g" } // end switch } // end Parser::reduce() diff --git a/src/libs/glsl/glslparsertable.cpp b/src/libs/glsl/glslparsertable.cpp index 67666dba7ed..55c39d1f996 100644 --- a/src/libs/glsl/glslparsertable.cpp +++ b/src/libs/glsl/glslparsertable.cpp @@ -1,26 +1,31 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** @@ -32,1266 +37,1258 @@ QT_BEGIN_NAMESPACE const char *const GLSLParserTable::spell [] = { - "end of file", "feed GLSL", "feed expression", "+=", "&", "&=", "&&", "attribute", "!", "bool", - "break", "bvec2", "bvec3", "bvec4", "^", "case", "centroid", ":", ",", "const", - "continue", "-", "--", "default", "discard", "/=", "dmat2", "dmat2x2", "dmat2x3", "dmat2x4", - "dmat3", "dmat3x2", "dmat3x3", "dmat3x4", "dmat4", "dmat4x2", "dmat4x3", "dmat4x4", "do", ".", - "double", "dvec2", "dvec3", "dvec4", "else", "=", "==", "flat", "float", "for", - ">=", "highp", "identifier", "if", "in", "++", "inout", "int", "invariant", "isampler1D", - "isampler1DArray", "isampler2D", "isampler2DArray", "isampler2DMS", "isampler2DMSArray", "isampler2DRect", "isampler3D", "isamplerBuffer", "isamplerCube", "isamplerCubeArray", - "ivec2", "ivec3", "ivec4", "layout", "<", "<<=", "{", "[", "<<", "(", - "<=", "lowp", "mat2", "mat2x2", "mat2x3", "mat2x4", "mat3", "mat3x2", "mat3x3", "mat3x4", - "mat4", "mat4x2", "mat4x3", "mat4x4", "mediump", "%=", "*=", "!=", "noperspective", "number constant", - "|=", "||", "out", "patch", "%", "plus", "precision", "?", "return", ">", - ">>=", "}", "]", ">>", ")", "sample", "sampler1D", "sampler1DArray", "sampler1DArrayShadow", "sampler1DShadow", - "sampler2D", "sampler2DArray", "sampler2DArrayShadow", "sampler2DMS", "sampler2DMSArray", "sampler2DRect", "sampler2DRectShadow", "sampler2DShadow", "sampler3D", "samplerBuffer", - "samplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "samplerCubeShadow", ";", "/", "smooth", "*", "struct", "subroutine", - "-=", "switch", "~", "type_name", "uint", "uniform", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", - "usampler2DMS", "usampler2DMSarray", "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "uvec2", "uvec3", "uvec4", - "varying", "vec2", "vec3", "vec4", "|", "void", "while", "^=", "^^", "true", - "false", "preprocessor directive", "comment", "error", "reserved word" -}; + "end of file", "feed GLSL", "feed expression", "+=", "&", "&=", "&&", "attribute", "!", "bool", + "break", "bvec2", "bvec3", "bvec4", "^", "case", "centroid", ":", ",", "const", + "continue", "-", "--", "default", "discard", "/=", "dmat2", "dmat2x2", "dmat2x3", "dmat2x4", + "dmat3", "dmat3x2", "dmat3x3", "dmat3x4", "dmat4", "dmat4x2", "dmat4x3", "dmat4x4", "do", ".", + "double", "dvec2", "dvec3", "dvec4", "else", "=", "==", "flat", "float", "for", + ">=", "highp", "identifier", "if", "in", "++", "inout", "int", "invariant", "isampler1D", + "isampler1DArray", "isampler2D", "isampler2DArray", "isampler2DMS", "isampler2DMSArray", "isampler2DRect", "isampler3D", "isamplerBuffer", "isamplerCube", "isamplerCubeArray", + "ivec2", "ivec3", "ivec4", "layout", "<", "<<=", "{", "[", "<<", "(", + "<=", "lowp", "mat2", "mat2x2", "mat2x3", "mat2x4", "mat3", "mat3x2", "mat3x3", "mat3x4", + "mat4", "mat4x2", "mat4x3", "mat4x4", "mediump", "%=", "*=", "!=", "noperspective", "number constant", + "|=", "||", "out", "patch", "%", "plus", "precision", "?", "return", ">", + ">>=", "}", "]", ">>", ")", "sample", "sampler1D", "sampler1DArray", "sampler1DArrayShadow", "sampler1DShadow", + "sampler2D", "sampler2DArray", "sampler2DArrayShadow", "sampler2DMS", "sampler2DMSArray", "sampler2DRect", "sampler2DRectShadow", "sampler2DShadow", "sampler3D", "samplerBuffer", + "samplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "samplerCubeShadow", ";", "/", "smooth", "*", "struct", "subroutine", + "-=", "switch", "~", "type_name", "uint", "uniform", "usampler1D", "usampler1DArray", "usampler2D", "usampler2DArray", + "usampler2DMS", "usampler2DMSarray", "usampler2DRect", "usampler3D", "usamplerBuffer", "usamplerCube", "usamplerCubeArray", "uvec2", "uvec3", "uvec4", + "varying", "vec2", "vec3", "vec4", "|", "void", "while", "^=", "^^", "true", + "false", "preprocessor directive", "comment", "error", "reserved word"}; const short GLSLParserTable::lhs [] = { - 176, 177, 177, 177, 177, 177, 179, 179, 179, 179, - 179, 179, 180, 181, 182, 182, 183, 183, 185, 185, - 184, 184, 186, 188, 188, 190, 190, 190, 190, 191, - 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, - 194, 194, 194, 195, 195, 195, 195, 195, 196, 196, - 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, - 201, 202, 202, 203, 203, 187, 187, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, 178, 178, - 205, 206, 206, 206, 206, 206, 206, 206, 206, 207, - 213, 213, 215, 215, 214, 218, 218, 216, 216, 216, - 216, 220, 220, 220, 220, 221, 208, 208, 208, 208, - 208, 208, 208, 223, 223, 223, 223, 223, 223, 223, - 223, 217, 217, 225, 226, 226, 226, 227, 228, 228, - 229, 229, 219, 211, 211, 211, 211, 211, 211, 211, - 211, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 189, 189, 210, 210, 210, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 209, 209, 209, 232, - 232, 212, 212, 233, 233, 234, 234, 235, 235, 235, - 224, 236, 237, 237, 239, 239, 239, 239, 239, 239, - 239, 238, 238, 247, 247, 248, 248, 246, 246, 240, - 240, 241, 249, 249, 250, 250, 242, 251, 251, 243, - 243, 244, 244, 244, 252, 252, 254, 254, 253, 253, - 245, 245, 245, 245, 245, 255, 256, 256, 257, 257, - 257, 258, 222, 175, 175, 259 -}; + 176, 177, 177, 177, 177, 177, 179, 179, 179, 179, + 179, 179, 180, 181, 182, 182, 183, 183, 185, 185, + 184, 184, 186, 188, 188, 190, 190, 190, 190, 191, + 191, 191, 191, 192, 192, 192, 192, 193, 193, 193, + 194, 194, 194, 195, 195, 195, 195, 195, 196, 196, + 196, 197, 197, 198, 198, 199, 199, 200, 200, 201, + 201, 202, 202, 203, 203, 187, 187, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, 178, 178, + 205, 206, 206, 206, 206, 206, 206, 206, 206, 207, + 213, 213, 215, 215, 214, 218, 218, 216, 216, 216, + 216, 220, 220, 220, 220, 221, 208, 208, 208, 208, + 208, 208, 208, 223, 223, 223, 223, 223, 223, 223, + 223, 217, 217, 225, 226, 226, 226, 227, 228, 228, + 229, 229, 219, 211, 211, 211, 211, 211, 211, 211, + 211, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 189, 189, 210, 210, 210, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, + 231, 231, 231, 231, 231, 231, 209, 209, 209, 232, + 232, 212, 212, 233, 233, 234, 234, 235, 235, 235, + 224, 236, 237, 237, 239, 239, 239, 239, 239, 239, + 239, 238, 238, 247, 247, 248, 248, 246, 246, 240, + 240, 241, 249, 249, 250, 250, 242, 251, 251, 243, + 243, 244, 244, 244, 252, 252, 254, 254, 253, 253, + 245, 245, 245, 245, 245, 255, 256, 256, 257, 257, + 257, 258, 222, 175, 175, 259}; const short GLSLParserTable::rhs [] = { - 1, 1, 1, 1, 1, 3, 1, 4, 1, 3, - 2, 2, 1, 1, 1, 3, 2, 2, 2, 1, - 2, 3, 2, 1, 1, 1, 2, 2, 2, 1, - 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, - 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, - 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, - 3, 1, 3, 1, 5, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 1, 2, 2, 4, 6, 7, 9, 10, 2, 2, - 1, 1, 2, 3, 3, 2, 5, 3, 2, 3, - 2, 1, 1, 1, 1, 1, 1, 3, 5, 6, - 7, 8, 5, 1, 2, 4, 5, 6, 7, 4, - 2, 1, 2, 1, 1, 1, 1, 4, 1, 3, - 1, 3, 1, 1, 1, 2, 2, 1, 2, 3, - 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, - 2, 2, 2, 1, 1, 2, 1, 3, 4, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, - 4, 1, 2, 3, 4, 1, 3, 1, 3, 4, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 3, 1, 1, 2, 3, 1, 2, 1, - 2, 5, 3, 1, 1, 4, 7, 1, 1, 3, - 2, 5, 7, 6, 1, 1, 1, 1, 2, 3, - 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, - 1, 2, 0, 2, 2, 2 -}; + 1, 1, 1, 1, 1, 3, 1, 4, 1, 3, + 2, 2, 1, 1, 1, 3, 2, 2, 2, 1, + 2, 3, 2, 1, 1, 1, 2, 2, 2, 1, + 1, 1, 1, 1, 3, 3, 3, 1, 3, 3, + 1, 3, 3, 1, 3, 3, 3, 3, 1, 3, + 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, + 3, 1, 3, 1, 5, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 2, 4, 6, 7, 9, 10, 2, 2, + 1, 1, 2, 3, 3, 2, 5, 3, 2, 3, + 2, 1, 1, 1, 1, 1, 1, 3, 5, 6, + 7, 8, 5, 1, 2, 4, 5, 6, 7, 4, + 2, 1, 2, 1, 1, 1, 1, 4, 1, 3, + 1, 3, 1, 1, 1, 2, 2, 1, 2, 3, + 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, + 2, 2, 2, 1, 1, 2, 1, 3, 4, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + 4, 1, 2, 3, 4, 1, 3, 1, 3, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 3, 1, 1, 2, 3, 1, 2, 1, + 2, 5, 3, 1, 1, 4, 7, 1, 1, 3, + 2, 5, 7, 6, 1, 1, 1, 1, 2, 3, + 2, 2, 2, 3, 2, 1, 1, 2, 1, 1, + 1, 2, 0, 2, 2, 2}; const short GLSLParserTable::action_default [] = { - 0, 0, 0, 0, 32, 165, 172, 173, 174, 31, - 0, 193, 196, 197, 198, 194, 199, 200, 201, 195, - 202, 203, 204, 162, 169, 170, 171, 4, 161, 247, - 1, 0, 163, 218, 222, 219, 223, 240, 243, 234, - 220, 237, 221, 224, 175, 176, 177, 0, 249, 181, - 184, 185, 186, 182, 187, 188, 189, 183, 190, 191, - 192, 248, 2, 30, 205, 212, 214, 209, 206, 213, - 215, 239, 242, 232, 233, 210, 207, 236, 208, 216, - 217, 211, 0, 33, 3, 246, 164, 225, 229, 226, - 230, 241, 244, 235, 227, 238, 228, 231, 178, 179, - 180, 166, 167, 168, 160, 41, 54, 79, 66, 52, - 56, 315, 9, 15, 20, 0, 0, 14, 0, 58, - 60, 64, 62, 38, 26, 0, 7, 49, 44, 245, - 24, 155, 157, 34, 0, 5, 28, 27, 0, 0, - 6, 80, 0, 0, 0, 143, 0, 142, 126, 146, - 141, 0, 127, 147, 0, 0, 125, 154, 144, 138, - 0, 135, 134, 252, 0, 0, 0, 148, 149, 145, - 0, 131, 129, 0, 0, 132, 0, 128, 130, 150, - 151, 152, 153, 137, 0, 139, 140, 136, 250, 253, - 0, 258, 256, 0, 0, 259, 81, 0, 34, 260, - 0, 255, 257, 0, 254, 0, 251, 0, 0, 40, - 0, 0, 0, 37, 36, 35, 39, 0, 53, 0, - 0, 50, 0, 0, 0, 0, 48, 0, 0, 42, - 43, 45, 47, 46, 51, 0, 55, 160, 21, 18, - 0, 17, 22, 23, 0, 57, 0, 59, 0, 0, - 63, 0, 61, 0, 0, 65, 12, 0, 11, 0, - 10, 16, 13, 0, 8, 156, 0, 158, 0, 159, - 72, 76, 70, 68, 74, 71, 69, 78, 75, 73, - 77, 0, 67, 29, 141, 0, 311, 310, 307, 306, - 114, 0, 309, 313, 92, 0, 0, 107, 314, 0, - 122, 121, 0, 0, 84, 308, 115, 0, 0, 95, - 261, 120, 116, 0, 0, 118, 117, 0, 119, 90, - 133, 103, 105, 104, 102, 93, 0, 313, 99, 101, - 106, 96, 0, 0, 97, 0, 98, 100, 106, 313, - 94, 0, 82, 312, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 276, 280, 0, 0, 269, 263, - 262, 265, 0, 266, 0, 270, 271, 267, 264, 278, - 0, 268, 122, 302, 0, 290, 301, 291, 305, 0, - 0, 0, 0, 0, 293, 0, 296, 295, 313, 122, - 298, 0, 297, 285, 0, 0, 0, 299, 300, 0, - 274, 275, 294, 0, 0, 286, 123, 0, 0, 0, - 282, 284, 0, 283, 272, 0, 273, 279, 303, 0, - 304, 0, 0, 0, 313, 288, 289, 0, 287, 0, - 0, 0, 292, 281, 277, 0, 83, 108, 0, 0, - 113, 109, 0, 0, 111, 110, 0, 112, 0, 89, - 0, 0, 0, 0, 85, 0, 86, 0, 0, 87, - 0, 88, 316 -}; + 0, 0, 0, 0, 32, 165, 172, 173, 174, 31, + 0, 193, 196, 197, 198, 194, 199, 200, 201, 195, + 202, 203, 204, 162, 169, 170, 171, 4, 161, 247, + 1, 0, 163, 218, 222, 219, 223, 240, 243, 234, + 220, 237, 221, 224, 175, 176, 177, 0, 249, 181, + 184, 185, 186, 182, 187, 188, 189, 183, 190, 191, + 192, 248, 2, 30, 205, 212, 214, 209, 206, 213, + 215, 239, 242, 232, 233, 210, 207, 236, 208, 216, + 217, 211, 0, 33, 3, 246, 164, 225, 229, 226, + 230, 241, 244, 235, 227, 238, 228, 231, 178, 179, + 180, 166, 167, 168, 160, 41, 54, 79, 66, 52, + 56, 315, 9, 15, 20, 0, 0, 14, 0, 58, + 60, 64, 62, 38, 26, 0, 7, 49, 44, 245, + 24, 155, 157, 34, 0, 5, 28, 27, 0, 0, + 6, 80, 0, 0, 0, 143, 0, 142, 126, 146, + 141, 0, 127, 147, 0, 0, 125, 154, 144, 138, + 0, 135, 134, 252, 0, 0, 0, 148, 149, 145, + 0, 131, 129, 0, 0, 132, 0, 128, 130, 150, + 151, 152, 153, 137, 0, 139, 140, 136, 250, 253, + 0, 258, 256, 0, 0, 259, 81, 0, 34, 260, + 0, 255, 257, 0, 254, 0, 251, 0, 0, 40, + 0, 0, 0, 37, 36, 35, 39, 0, 53, 0, + 0, 50, 0, 0, 0, 0, 48, 0, 0, 42, + 43, 45, 47, 46, 51, 0, 55, 160, 21, 18, + 0, 17, 22, 23, 0, 57, 0, 59, 0, 0, + 63, 0, 61, 0, 0, 65, 12, 0, 11, 0, + 10, 16, 13, 0, 8, 156, 0, 158, 0, 159, + 72, 76, 70, 68, 74, 71, 69, 78, 75, 73, + 77, 0, 67, 29, 141, 0, 311, 310, 307, 306, + 114, 0, 309, 313, 92, 0, 0, 107, 314, 0, + 122, 121, 0, 0, 84, 308, 115, 0, 0, 95, + 261, 120, 116, 0, 0, 118, 117, 0, 119, 90, + 133, 103, 105, 104, 102, 93, 0, 313, 99, 101, + 106, 96, 0, 0, 97, 0, 98, 100, 106, 313, + 94, 0, 82, 312, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 276, 280, 0, 0, 269, 263, + 262, 265, 0, 266, 0, 270, 271, 267, 264, 278, + 0, 268, 122, 302, 0, 290, 301, 291, 305, 0, + 0, 0, 0, 0, 293, 0, 296, 295, 313, 122, + 298, 0, 297, 285, 0, 0, 0, 299, 300, 0, + 274, 275, 294, 0, 0, 286, 123, 0, 0, 0, + 282, 284, 0, 283, 272, 0, 273, 279, 303, 0, + 304, 0, 0, 0, 313, 288, 289, 0, 287, 0, + 0, 0, 292, 281, 277, 0, 83, 108, 0, 0, + 113, 109, 0, 0, 111, 110, 0, 112, 0, 89, + 0, 0, 0, 0, 85, 0, 86, 0, 0, 87, + 0, 88, 316}; const short GLSLParserTable::goto_default [] = { - 3, 135, 126, 362, 124, 263, 112, 117, 113, 116, - 115, 114, 107, 118, 130, 133, 134, 123, 105, 128, - 127, 109, 106, 110, 119, 120, 122, 121, 108, 281, - 197, 360, 364, 296, 125, 131, 299, 205, 291, 293, - 294, 325, 290, 328, 327, 326, 329, 324, 297, 311, - 160, 159, 161, 173, 172, 162, 132, 129, 163, 203, - 192, 361, 369, 359, 368, 363, 367, 371, 358, 365, - 366, 370, 402, 400, 410, 390, 427, 388, 394, 391, - 298, 289, 288, 292, 0 -}; + 3, 135, 126, 362, 124, 263, 112, 117, 113, 116, + 115, 114, 107, 118, 130, 133, 134, 123, 105, 128, + 127, 109, 106, 110, 119, 120, 122, 121, 108, 281, + 197, 360, 364, 296, 125, 131, 299, 205, 291, 293, + 294, 325, 290, 328, 327, 326, 329, 324, 297, 311, + 160, 159, 161, 173, 172, 162, 132, 129, 163, 203, + 192, 361, 369, 359, 368, 363, 367, 371, 358, 365, + 366, 370, 402, 400, 410, 390, 427, 388, 394, 391, + 298, 289, 288, 292, 0}; const short GLSLParserTable::action_index [] = { - 86, 1180, 3189, 58, -175, -175, -175, -175, -175, -175, - 1180, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -79, 1180, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, 1180, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, 32, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, -175, -175, -175, -175, 82, 61, -175, -175, 60, - 181, 45, -175, -175, 1347, -55, 87, -175, -25, -113, - -3, 6, -159, 40, 128, 515, -175, 112, 26, -175, - -175, -175, -58, 197, 1180, -175, -175, -175, 84, 1180, - -175, -175, -62, 2517, 2517, -175, 56, -175, -175, -175, - 187, -54, -175, -175, 46, 25, -175, -175, -175, 349, - 207, 349, -175, -175, 2685, 681, 10, -175, -175, -175, - 3, 11, -175, 83, -38, -175, 0, -175, -175, -175, - -175, -175, -175, -175, 349, -175, -175, -175, -175, -175, - 18, -6, -175, 79, 1514, -175, -175, -77, -175, -175, - -16, -175, -175, 76, -175, 3021, -175, 1180, 1180, 12, - 1180, 1180, 1180, -175, -175, -175, 37, 1180, 49, 1180, - 1180, 90, 1180, 1180, 1180, 1180, 15, 1180, 1180, 71, - 68, -4, 8, 7, 80, 1180, 33, -75, -175, -175, - 1180, -175, -175, -175, 1180, 181, 1180, -132, 1180, 1180, - -137, 1180, 34, 73, 1180, -175, -175, 847, -175, 1180, - -10, -175, 48, -44, -175, -175, 2349, -175, -45, -175, - -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, - -175, 1180, -175, -175, 217, 72, -175, -175, -175, 3189, - -47, -107, -175, 163, -14, 22, 81, -175, -175, 1013, - -175, -175, 515, -105, -175, -175, 66, 1180, 2015, -175, - -175, -175, -21, -91, 1180, -175, -34, 1180, -175, -175, - -175, -175, -175, -175, -175, -175, 681, 63, -175, -175, - -40, -76, 1180, -78, -175, 681, -175, -175, 5, 105, - -175, 4365, -175, -175, -81, 1180, -121, -2, -114, 3861, - -56, -53, 4533, 2182, -175, -175, -57, -69, -175, -175, - -175, -175, 54, -175, -74, -175, -175, -175, -175, -175, - 4029, -175, -46, -175, 59, -175, -175, -175, -175, -128, - -49, 1180, 55, -93, -175, 3525, -175, -175, 3357, -37, - -175, -90, -175, 27, -68, -5, 681, 1180, 30, 3693, - -175, -175, -175, 4, 1180, -175, -175, 1180, 57, 3861, - -175, -1, 3861, -175, -175, 4197, -175, -175, -175, 62, - -175, 1180, 64, 20, 3861, -175, 3861, -103, -175, 3357, - -86, 3693, -175, -175, -175, -35, -175, 38, 1180, 1848, - -175, -27, -85, 1180, -175, -43, 1180, -175, -70, -175, - 2517, 2853, 29, 1, -175, 1681, -175, -84, -48, -175, - -118, -175, -175, + 86, 1180, 3189, 58, -175, -175, -175, -175, -175, -175, + 1180, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -79, 1180, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, 1180, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, 32, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, -175, -175, 82, 61, -175, -175, 60, + 181, 45, -175, -175, 1347, -55, 87, -175, -25, -113, + -3, 6, -159, 40, 128, 515, -175, 112, 26, -175, + -175, -175, -58, 197, 1180, -175, -175, -175, 84, 1180, + -175, -175, -62, 2517, 2517, -175, 56, -175, -175, -175, + 187, -54, -175, -175, 46, 25, -175, -175, -175, 349, + 207, 349, -175, -175, 2685, 681, 10, -175, -175, -175, + 3, 11, -175, 83, -38, -175, 0, -175, -175, -175, + -175, -175, -175, -175, 349, -175, -175, -175, -175, -175, + 18, -6, -175, 79, 1514, -175, -175, -77, -175, -175, + -16, -175, -175, 76, -175, 3021, -175, 1180, 1180, 12, + 1180, 1180, 1180, -175, -175, -175, 37, 1180, 49, 1180, + 1180, 90, 1180, 1180, 1180, 1180, 15, 1180, 1180, 71, + 68, -4, 8, 7, 80, 1180, 33, -75, -175, -175, + 1180, -175, -175, -175, 1180, 181, 1180, -132, 1180, 1180, + -137, 1180, 34, 73, 1180, -175, -175, 847, -175, 1180, + -10, -175, 48, -44, -175, -175, 2349, -175, -45, -175, + -175, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, 1180, -175, -175, 217, 72, -175, -175, -175, 3189, + -47, -107, -175, 163, -14, 22, 81, -175, -175, 1013, + -175, -175, 515, -105, -175, -175, 66, 1180, 2015, -175, + -175, -175, -21, -91, 1180, -175, -34, 1180, -175, -175, + -175, -175, -175, -175, -175, -175, 681, 63, -175, -175, + -40, -76, 1180, -78, -175, 681, -175, -175, 5, 105, + -175, 4365, -175, -175, -81, 1180, -121, -2, -114, 3861, + -56, -53, 4533, 2182, -175, -175, -57, -69, -175, -175, + -175, -175, 54, -175, -74, -175, -175, -175, -175, -175, + 4029, -175, -46, -175, 59, -175, -175, -175, -175, -128, + -49, 1180, 55, -93, -175, 3525, -175, -175, 3357, -37, + -175, -90, -175, 27, -68, -5, 681, 1180, 30, 3693, + -175, -175, -175, 4, 1180, -175, -175, 1180, 57, 3861, + -175, -1, 3861, -175, -175, 4197, -175, -175, -175, 62, + -175, 1180, 64, 20, 3861, -175, 3861, -103, -175, 3357, + -86, 3693, -175, -175, -175, -35, -175, 38, 1180, 1848, + -175, -27, -85, 1180, -175, -43, 1180, -175, -70, -175, + 2517, 2853, 29, 1, -175, 1681, -175, -84, -48, -175, + -118, -175, -175, - -85, 11, 90, -85, -85, -85, -85, -85, -85, -85, - -3, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -9, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, 70, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, 20, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, 3, -85, -85, -85, -85, - -85, -85, -85, -85, 9, -85, -85, -85, -85, 5, - -85, -85, -85, 56, 110, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -39, - 21, -21, -85, -85, 96, -7, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -49, -85, -85, -85, - -85, -85, -85, -85, -47, -85, -85, -85, -85, -85, - -46, -85, -85, -85, 35, -85, -85, -85, -85, -85, - -45, -85, -85, -85, -85, 109, -85, 29, 30, -85, - -4, -5, -6, -85, -85, -85, -85, 38, -85, 40, - 41, -85, 43, 78, 84, 81, -85, 80, 66, -85, - -85, -85, -85, -85, -85, 67, -85, -85, -85, -85, - -12, -85, -85, -85, 42, -85, 51, -85, 52, 27, - -85, 49, -85, -85, 24, -85, -85, 18, -85, 22, - -85, -85, -85, -85, -85, -85, 114, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, 6, -85, -85, -85, -11, -85, -85, -85, 129, - -85, -85, -85, -85, -85, -38, -85, -85, -85, 23, - -85, -85, -2, -85, -85, -85, -85, 19, 79, -85, - -85, -85, -85, -85, 39, -85, -85, 37, -85, -85, - -85, -85, -85, -85, -85, -85, 14, -18, -85, -85, - -85, -85, 121, -85, -85, 94, -85, -85, -85, -19, - -85, 7, -85, -85, -85, 16, -85, -85, -85, 77, - -85, -85, 87, 17, -85, -85, -85, -85, -85, -85, - -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, - 65, -85, -85, -85, -85, -85, -85, -85, -85, -85, - -85, 26, -85, -85, -85, 91, -85, -85, 159, -85, - -85, -85, -85, -85, -85, -85, -13, -1, -85, 54, - -85, -85, -85, -85, 57, -85, -85, 1, -85, 69, - -85, -85, 141, -85, -85, 76, -85, -85, -85, -85, - -85, 0, -85, -85, 88, -85, 25, -85, -85, 223, - -85, 100, -85, -85, -85, -85, -85, -85, 36, 138, - -85, -85, -85, 31, -85, -85, 28, -85, -85, -85, - 97, 105, -85, -85, -85, 98, -85, -85, -85, -85, - -85, -85, -85 -}; + -85, 11, 90, -85, -85, -85, -85, -85, -85, -85, + -3, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -9, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, 70, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, 20, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, 3, -85, -85, -85, -85, + -85, -85, -85, -85, 9, -85, -85, -85, -85, 5, + -85, -85, -85, 56, 110, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -39, + 21, -21, -85, -85, 96, -7, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -49, -85, -85, -85, + -85, -85, -85, -85, -47, -85, -85, -85, -85, -85, + -46, -85, -85, -85, 35, -85, -85, -85, -85, -85, + -45, -85, -85, -85, -85, 109, -85, 29, 30, -85, + -4, -5, -6, -85, -85, -85, -85, 38, -85, 40, + 41, -85, 43, 78, 84, 81, -85, 80, 66, -85, + -85, -85, -85, -85, -85, 67, -85, -85, -85, -85, + -12, -85, -85, -85, 42, -85, 51, -85, 52, 27, + -85, 49, -85, -85, 24, -85, -85, 18, -85, 22, + -85, -85, -85, -85, -85, -85, 114, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, 6, -85, -85, -85, -11, -85, -85, -85, 129, + -85, -85, -85, -85, -85, -38, -85, -85, -85, 23, + -85, -85, -2, -85, -85, -85, -85, 19, 79, -85, + -85, -85, -85, -85, 39, -85, -85, 37, -85, -85, + -85, -85, -85, -85, -85, -85, 14, -18, -85, -85, + -85, -85, 121, -85, -85, 94, -85, -85, -85, -19, + -85, 7, -85, -85, -85, 16, -85, -85, -85, 77, + -85, -85, 87, 17, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + 65, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, 26, -85, -85, -85, 91, -85, -85, 159, -85, + -85, -85, -85, -85, -85, -85, -13, -1, -85, 54, + -85, -85, -85, -85, 57, -85, -85, 1, -85, 69, + -85, -85, 141, -85, -85, 76, -85, -85, -85, -85, + -85, 0, -85, -85, 88, -85, 25, -85, -85, 223, + -85, 100, -85, -85, -85, -85, -85, -85, 36, 138, + -85, -85, -85, 31, -85, -85, 28, -85, -85, -85, + 97, 105, -85, -85, -85, 98, -85, -85, -85, -85, + -85, -85, -85}; const short GLSLParserTable::action_info [] = { - -25, 332, 446, 246, 339, 306, 450, 319, 428, 251, - 429, 317, 331, 376, 144, 377, 461, 437, 443, 266, - 378, 316, 421, 385, 314, 170, 407, 445, 431, 304, - 381, 251, 244, -24, 334, 199, 191, 217, 380, -19, - 246, 384, -24, 412, 397, 139, 399, 403, 139, 404, - 459, 244, 171, 373, 243, 171, 174, 331, 462, 239, - 342, 175, 191, 139, 460, 217, 139, 269, 264, -25, - 191, 194, 139, 139, 227, 139, 375, 139, 455, 181, - 139, 453, 139, 438, 142, 227, 227, 2, 1, 207, - 254, 139, 207, 227, 200, 219, 424, 200, 341, 435, - 179, 176, 139, 207, 227, 240, 219, 248, 143, 228, - 167, 307, 0, 249, 0, 439, 210, 321, 0, 322, - 228, 228, 0, 29, 320, 0, 0, 182, 228, 0, - 222, 0, 0, 0, 0, 456, 0, 0, 0, 228, - 222, 210, 0, 308, 210, 309, 220, 211, 180, 212, - 256, 0, 0, 48, 223, 0, 342, 220, 168, 321, - 224, 322, 222, 454, 223, 323, 61, 257, 0, 383, - 224, 409, 211, 208, 212, 211, 208, 212, 423, 0, - 0, 0, 320, 258, 0, 0, 223, 208, 433, 225, - 0, 0, 224, 0, -124, 235, 420, 177, 140, 225, - 270, 241, 271, -124, 0, 259, -124, 323, 0, 0, - 204, 0, 0, 201, 145, 436, 169, 321, 0, 322, - 0, 225, 272, 146, -124, 0, 147, 0, 0, 0, - 0, 0, 0, -124, -124, 0, -124, 0, 0, 0, - 0, -124, 273, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, - 0, 149, 0, 0, -124, 323, 0, 0, 0, 301, - 0, -124, 274, 0, 0, 0, 0, -91, 0, 0, - 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, - -124, 0, 275, 276, 0, 0, 0, 277, 0, 0, - 0, 0, -124, 0, 0, 152, 0, 278, 0, 153, - 154, 0, 0, 0, 0, -124, 0, 0, 0, -124, - -124, 0, 155, -124, 0, 0, 0, 0, 0, 0, - 0, 0, -124, 0, 0, 0, 0, 279, 0, 0, - 0, 0, 0, 156, 0, 0, 0, -124, 0, 0, - 0, 0, 157, -124, 0, 0, 145, 0, 0, 0, - 0, 0, -124, 0, 280, 146, 0, 158, 147, 0, - 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 6, 7, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, - 0, 0, 32, 0, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 0, 0, 82, 0, 0, 0, 0, 85, 86, - 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, - 0, 0, 29, 0, 0, 0, 0, 0, 32, 0, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, - 0, 0, 0, 0, 85, 86, 0, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 0, 6, 7, - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 0, 28, 0, 0, 29, 260, - 0, 0, 0, 0, 32, 0, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, - 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, - 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 0, 6, 7, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, - 0, 28, 0, 0, 29, 448, 0, 0, 0, 0, - 32, 0, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, - 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 449, 0, 0, - 0, 82, 0, 0, 0, 0, 85, 86, 0, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 0, 101, 102, 103, 0, 104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, - 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, - 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, - 23, 24, 25, 26, 0, 0, 0, 0, 28, 0, - 0, 29, 30, 0, 0, 31, 0, 32, 0, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 0, 0, 0, 0, 0, 0, 47, - 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 0, 0, 0, 0, 62, - 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 0, 0, 0, 0, 82, 0, - 0, 0, 83, 85, 86, 0, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, - 0, 101, 102, 103, 0, 104, 0, 0, 0, 84, - 27, 0, 0, 0, 0, 4, 5, 0, 6, 7, - 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 0, 28, 0, 0, 29, 30, - 0, 0, 31, 0, 32, 0, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 0, 0, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 62, 0, 0, 0, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 0, 0, 82, 0, 0, 0, 83, - 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, - 103, 0, 237, 0, 0, 0, 84, 27, 0, 0, - 0, 0, 4, 5, 0, 6, 7, 8, 0, 0, - 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 0, 0, 23, 24, 25, 26, 0, 0, - 0, 0, 28, 0, 0, 29, 30, 0, 0, 31, - 0, 32, 0, 33, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, - 0, 0, 0, 47, 0, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, - 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, - 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, - 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 0, 0, - 0, 0, 82, 0, 0, 0, 83, 85, 86, 0, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 0, 101, 102, 103, 0, 104, - 0, 0, 0, 84, 27, 0, 0, 0, 0, 4, - 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 10, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, - 0, 0, 29, 30, 0, 0, 31, 0, 32, 0, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, - 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, - 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, - 0, 0, 0, 457, 0, 0, 0, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, - 0, 0, 0, 83, 85, 86, 0, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, - 84, 27, 0, 0, 0, 0, 4, 5, 0, 6, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, - 10, 0, 0, 0, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, - 25, 26, 0, 0, 0, 0, 28, 0, 0, 29, - 30, 0, 0, 31, 0, 32, 0, 33, 34, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 0, 0, 0, 0, 0, 0, 47, 0, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 0, 0, 0, 0, 62, 0, 0, - 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, - 441, 0, 0, 0, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 0, 0, 0, 0, 82, 0, 0, 0, - 83, 85, 86, 0, 87, 88, 89, 90, 91, 92, - 93, 94, 95, 96, 97, 98, 99, 100, 0, 101, - 102, 103, 0, 104, 0, 0, 0, 84, 27, 0, - 0, 0, 0, 4, 5, 0, 6, 7, 8, 0, - 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 0, 28, 0, 0, 29, 30, 0, 0, - 31, 0, 32, 0, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, - 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 0, 0, 0, 312, 0, 0, - 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 0, 0, 82, 0, 0, 0, 83, 85, 86, - 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, - 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, - 4, 5, 0, 6, 7, 8, 0, 0, 0, 0, - 0, 0, 0, 9, 10, 0, 0, 0, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 0, 0, 23, 24, 25, 26, 0, 0, 0, 0, - 28, 0, 0, 29, 30, 0, 0, 31, 0, 32, - 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, - 0, 47, 0, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 418, 0, 0, 0, - 82, 0, 0, 0, 83, 85, 86, 0, 87, 88, - 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99, 100, 0, 101, 102, 103, 0, 104, 0, 0, - 0, 84, 27, 0, 0, 0, 0, 4, 5, 0, - 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, - 9, 10, 0, 0, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, - 24, 25, 26, 0, 0, 0, 0, 28, 0, 0, - 29, 30, 0, 0, 31, 0, 32, 0, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 0, 0, 0, 0, 0, 0, 47, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 0, 62, 0, - 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, - 0, 267, 0, 0, 0, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 0, 0, 0, 0, 82, 0, 0, - 0, 83, 85, 86, 0, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 0, - 101, 102, 103, 0, 104, 0, 0, 0, 84, 27, - 0, 0, 0, 0, 145, 0, 5, 0, 6, 7, - 8, 0, 0, 146, 0, 0, 147, 0, 0, 0, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 0, 0, 29, 0, - 0, 149, 0, 0, 32, 150, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 0, 0, 0, 0, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 0, 0, 0, 153, - 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 156, 0, 82, 0, 0, 0, 0, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 145, 0, 5, 0, 6, 7, 8, 0, - 0, 146, 0, 0, 147, 0, 0, 0, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 0, 0, 29, 0, 0, 149, - 0, 0, 32, 150, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, - 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, - 0, 156, 0, 82, 0, 0, 0, 0, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 145, 0, 5, 0, 6, 7, 8, 0, 0, 146, - 0, 0, 147, 0, 0, 0, 0, 0, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 0, 0, 29, 0, 0, 149, 0, 0, - 32, 150, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 0, - 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, - 0, 0, 0, 0, 452, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 0, 0, 156, - 0, 82, 0, 0, 0, 0, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, - 5, 0, 6, 7, 8, 0, 0, 146, 0, 0, - 147, 0, 0, 0, 0, 0, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, - 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, - 0, 0, 29, 0, 0, 149, 0, 0, 32, 150, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 151, 0, 0, 0, 0, 0, - 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, - 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, - 0, 0, 206, 0, 0, 0, 155, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 0, 0, 156, 0, 82, - 0, 0, 0, 0, 85, 86, 157, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 158, 101, 102, 103, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 145, 0, 5, 0, - 6, 7, 8, 0, 0, 146, 0, 0, 147, 0, - 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, - 24, 25, 26, 0, 0, 0, 148, 28, 0, 0, - 29, 0, 0, 149, 0, 0, 32, 284, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 151, 0, 0, 0, 0, 0, 0, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 152, 0, 0, - 0, 153, 154, 0, 0, 285, 0, 0, 0, 0, - 0, 0, 0, 0, 155, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 286, 0, 156, 0, 82, 0, 0, - 0, 0, 85, 86, 157, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, - 101, 102, 103, 0, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 145, 4, 5, 0, 6, 7, - 8, 0, 0, 146, 0, 0, 147, 0, 9, 10, - 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 0, 0, 29, 30, - 0, 149, 31, 0, 32, 150, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 0, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, - 154, 0, 63, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 0, 0, 156, 0, 82, 0, 0, 0, 83, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 0, 0, 0, 84, 27, 0, 0, - 0, 0, 145, 4, 5, 0, 6, 7, 8, 0, - 0, 146, 0, 0, 147, 0, 9, 10, 0, 0, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 0, 0, 29, 30, 0, 149, - 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, - 63, 285, 0, 0, 0, 0, 0, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, - 0, 156, 0, 82, 0, 0, 0, 83, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, - 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, - 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, - 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 341, - 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, - 0, 353, 0, 0, 0, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, - 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, - 0, 0, 84, 27, 0, 0, 0, 0, 145, 4, - 5, 344, 6, 7, 8, 0, 345, 146, 0, 0, - 147, 346, 9, 10, 347, 348, 0, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 349, - 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, - 350, 0, 29, 30, 351, 149, 31, 0, 32, 284, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 151, 0, 0, 352, 0, 0, - 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, - 62, 0, 0, 153, 154, 0, 63, 285, 0, 353, - 0, 0, 0, 0, 0, 0, 155, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 355, 0, 156, 0, 82, - 0, 0, 356, 83, 85, 86, 157, 87, 88, 89, - 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 158, 101, 102, 103, 0, 104, 357, 0, 0, - 84, 27, 0, 0, 0, 0, 145, 4, 5, 344, - 6, 7, 8, 0, 345, 146, 0, 0, 147, 346, - 9, 10, 347, 348, 0, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 349, 0, 23, - 24, 25, 26, 0, 0, 0, 148, 28, 350, 0, - 29, 30, 351, 149, 31, 0, 32, 284, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 151, 0, 0, 352, 0, 0, 47, 0, - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 0, 0, 0, 152, 62, 0, - 0, 153, 154, 0, 63, 285, 0, 353, 0, 0, - 434, 0, 0, 0, 155, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 355, 0, 156, 0, 82, 0, 0, - 356, 83, 85, 86, 157, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, - 101, 102, 103, 0, 104, 357, 0, 0, 84, 27, - 0, 0, 0, 0, 145, 4, 5, 344, 6, 7, - 8, 0, 345, 146, 0, 0, 147, 346, 9, 10, - 347, 348, 0, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 349, 0, 23, 24, 25, - 26, 0, 0, 0, 148, 28, 350, 0, 29, 30, - 351, 149, 31, 0, 32, 284, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 151, 0, 0, 352, 0, 0, 47, 0, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, - 154, 0, 63, 285, 0, 353, 0, 0, 416, 0, - 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 355, 0, 156, 0, 82, 0, 0, 356, 83, - 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, - 103, 0, 104, 357, 0, 0, 84, 27, 0, 0, - 0, 0, 145, 4, 5, 344, 6, 7, 8, 0, - 345, 146, 0, 0, 147, 346, 9, 10, 347, 348, - 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 349, 0, 23, 24, 25, 26, 0, - 0, 0, 148, 28, 350, 0, 29, 30, 351, 149, - 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, - 0, 352, 0, 0, 47, 0, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, - 63, 285, 0, 353, 0, 0, 354, 0, 0, 0, - 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, - 0, 156, 0, 82, 0, 0, 356, 83, 85, 86, - 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, - 104, 357, 0, 0, 84, 27, 0, 0, 0, 0, - 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, - 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, - 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, - 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 151, 0, 0, 352, - 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, - 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, - 0, 353, 0, 0, 414, 0, 0, 0, 155, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, - 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, - 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, - 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, - 0, 0, 84, 27, 0, 0, 0, 0, + -25, 332, 446, 246, 339, 306, 450, 319, 428, 251, + 429, 317, 331, 376, 144, 377, 461, 437, 443, 266, + 378, 316, 421, 385, 314, 170, 407, 445, 431, 304, + 381, 251, 244, -24, 334, 199, 191, 217, 380, -19, + 246, 384, -24, 412, 397, 139, 399, 403, 139, 404, + 459, 244, 171, 373, 243, 171, 174, 331, 462, 239, + 342, 175, 191, 139, 460, 217, 139, 269, 264, -25, + 191, 194, 139, 139, 227, 139, 375, 139, 455, 181, + 139, 453, 139, 438, 142, 227, 227, 2, 1, 207, + 254, 139, 207, 227, 200, 219, 424, 200, 341, 435, + 179, 176, 139, 207, 227, 240, 219, 248, 143, 228, + 167, 307, 0, 249, 0, 439, 210, 321, 0, 322, + 228, 228, 0, 29, 320, 0, 0, 182, 228, 0, + 222, 0, 0, 0, 0, 456, 0, 0, 0, 228, + 222, 210, 0, 308, 210, 309, 220, 211, 180, 212, + 256, 0, 0, 48, 223, 0, 342, 220, 168, 321, + 224, 322, 222, 454, 223, 323, 61, 257, 0, 383, + 224, 409, 211, 208, 212, 211, 208, 212, 423, 0, + 0, 0, 320, 258, 0, 0, 223, 208, 433, 225, + 0, 0, 224, 0, -124, 235, 420, 177, 140, 225, + 270, 241, 271, -124, 0, 259, -124, 323, 0, 0, + 204, 0, 0, 201, 145, 436, 169, 321, 0, 322, + 0, 225, 272, 146, -124, 0, 147, 0, 0, 0, + 0, 0, 0, -124, -124, 0, -124, 0, 0, 0, + 0, -124, 273, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 148, 0, 0, 0, 0, 0, + 0, 149, 0, 0, -124, 323, 0, 0, 0, 301, + 0, -124, 274, 0, 0, 0, 0, -91, 0, 0, + 0, 0, 0, 0, 0, -124, 0, 0, 0, -124, + -124, 0, 275, 276, 0, 0, 0, 277, 0, 0, + 0, 0, -124, 0, 0, 152, 0, 278, 0, 153, + 154, 0, 0, 0, 0, -124, 0, 0, 0, -124, + -124, 0, 155, -124, 0, 0, 0, 0, 0, 0, + 0, 0, -124, 0, 0, 0, 0, 279, 0, 0, + 0, 0, 0, 156, 0, 0, 0, -124, 0, 0, + 0, 0, 157, -124, 0, 0, 145, 0, 0, 0, + 0, 0, -124, 0, 280, 146, 0, 158, 147, 0, + 0, 0, 0, 0, 0, 0, 0, -124, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 149, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 157, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 0, 6, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, + 0, 0, 32, 0, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 0, 0, 82, 0, 0, 0, 0, 85, 86, + 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, + 0, 0, 29, 0, 0, 0, 0, 0, 32, 0, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 85, 86, 0, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 0, 28, 0, 0, 29, 260, + 0, 0, 0, 0, 32, 0, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 0, 0, 82, 0, 0, 0, 0, + 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, + 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 0, 6, 7, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, + 0, 28, 0, 0, 29, 448, 0, 0, 0, 0, + 32, 0, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 449, 0, 0, + 0, 82, 0, 0, 0, 0, 85, 86, 0, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 0, 101, 102, 103, 0, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, + 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, + 0, 9, 10, 0, 0, 0, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, + 23, 24, 25, 26, 0, 0, 0, 0, 28, 0, + 0, 29, 30, 0, 0, 31, 0, 32, 0, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 45, 46, 0, 0, 0, 0, 0, 0, 47, + 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 0, 0, 0, 0, 62, + 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 0, 0, 0, 0, 82, 0, + 0, 0, 83, 85, 86, 0, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, + 0, 101, 102, 103, 0, 104, 0, 0, 0, 84, + 27, 0, 0, 0, 0, 4, 5, 0, 6, 7, + 8, 0, 0, 0, 0, 0, 0, 0, 9, 10, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 0, 28, 0, 0, 29, 30, + 0, 0, 31, 0, 32, 0, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 0, 0, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 0, 62, 0, 0, 0, + 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 0, 0, 82, 0, 0, 0, 83, + 85, 86, 0, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 0, 101, 102, + 103, 0, 237, 0, 0, 0, 84, 27, 0, 0, + 0, 0, 4, 5, 0, 6, 7, 8, 0, 0, + 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 0, 0, 23, 24, 25, 26, 0, 0, + 0, 0, 28, 0, 0, 29, 30, 0, 0, 31, + 0, 32, 0, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 0, 0, 0, + 0, 0, 0, 47, 0, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, + 0, 0, 0, 62, 0, 0, 0, 0, 0, 63, + 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 0, 0, + 0, 0, 82, 0, 0, 0, 83, 85, 86, 0, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 0, 101, 102, 103, 0, 104, + 0, 0, 0, 84, 27, 0, 0, 0, 0, 4, + 5, 0, 6, 7, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 10, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 0, 28, + 0, 0, 29, 30, 0, 0, 31, 0, 32, 0, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 0, 0, 0, 0, 0, 0, + 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, + 62, 0, 0, 0, 0, 0, 63, 0, 0, 0, + 0, 0, 0, 457, 0, 0, 0, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 0, 0, 82, + 0, 0, 0, 83, 85, 86, 0, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 0, 101, 102, 103, 0, 104, 0, 0, 0, + 84, 27, 0, 0, 0, 0, 4, 5, 0, 6, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 9, + 10, 0, 0, 0, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 0, 0, 23, 24, + 25, 26, 0, 0, 0, 0, 28, 0, 0, 29, + 30, 0, 0, 31, 0, 32, 0, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 0, 0, 0, 0, 0, 0, 47, 0, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 0, 0, 0, 0, 62, 0, 0, + 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, + 441, 0, 0, 0, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 0, 0, 0, 0, 82, 0, 0, 0, + 83, 85, 86, 0, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 0, 101, + 102, 103, 0, 104, 0, 0, 0, 84, 27, 0, + 0, 0, 0, 4, 5, 0, 6, 7, 8, 0, + 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 0, 28, 0, 0, 29, 30, 0, 0, + 31, 0, 32, 0, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, + 63, 0, 0, 0, 0, 0, 0, 312, 0, 0, + 0, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 0, 0, 82, 0, 0, 0, 83, 85, 86, + 0, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 0, 101, 102, 103, 0, + 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, + 4, 5, 0, 6, 7, 8, 0, 0, 0, 0, + 0, 0, 0, 9, 10, 0, 0, 0, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 0, 0, 23, 24, 25, 26, 0, 0, 0, 0, + 28, 0, 0, 29, 30, 0, 0, 31, 0, 32, + 0, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 0, 0, 0, 0, 0, + 0, 47, 0, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, + 0, 62, 0, 0, 0, 0, 0, 63, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 418, 0, 0, 0, + 82, 0, 0, 0, 83, 85, 86, 0, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 0, 101, 102, 103, 0, 104, 0, 0, + 0, 84, 27, 0, 0, 0, 0, 4, 5, 0, + 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, + 9, 10, 0, 0, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, + 24, 25, 26, 0, 0, 0, 0, 28, 0, 0, + 29, 30, 0, 0, 31, 0, 32, 0, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 0, 0, 0, 0, 0, 0, 47, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 0, 62, 0, + 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, + 0, 267, 0, 0, 0, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 0, 0, 0, 0, 82, 0, 0, + 0, 83, 85, 86, 0, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 0, + 101, 102, 103, 0, 104, 0, 0, 0, 84, 27, + 0, 0, 0, 0, 145, 0, 5, 0, 6, 7, + 8, 0, 0, 146, 0, 0, 147, 0, 0, 0, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 0, 0, 29, 0, + 0, 149, 0, 0, 32, 150, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 0, 0, 0, 153, + 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 156, 0, 82, 0, 0, 0, 0, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 145, 0, 5, 0, 6, 7, 8, 0, + 0, 146, 0, 0, 147, 0, 0, 0, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 0, 0, 29, 0, 0, 149, + 0, 0, 32, 150, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 0, 0, 0, 0, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 0, 0, 0, 153, 154, 0, + 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 0, + 0, 156, 0, 82, 0, 0, 0, 0, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 145, 0, 5, 0, 6, 7, 8, 0, 0, 146, + 0, 0, 147, 0, 0, 0, 0, 0, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 0, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 0, 0, 29, 0, 0, 149, 0, 0, + 32, 150, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 0, 0, 0, 153, 154, 0, 0, 0, + 0, 0, 0, 0, 452, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 0, 0, 156, + 0, 82, 0, 0, 0, 0, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 145, 0, + 5, 0, 6, 7, 8, 0, 0, 146, 0, 0, + 147, 0, 0, 0, 0, 0, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, + 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, + 0, 0, 29, 0, 0, 149, 0, 0, 32, 150, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 151, 0, 0, 0, 0, 0, + 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, + 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, + 0, 0, 206, 0, 0, 0, 155, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 0, 0, 156, 0, 82, + 0, 0, 0, 0, 85, 86, 157, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 158, 101, 102, 103, 0, 104, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 145, 0, 5, 0, + 6, 7, 8, 0, 0, 146, 0, 0, 147, 0, + 0, 0, 0, 0, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, + 24, 25, 26, 0, 0, 0, 148, 28, 0, 0, + 29, 0, 0, 149, 0, 0, 32, 284, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 151, 0, 0, 0, 0, 0, 0, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 152, 0, 0, + 0, 153, 154, 0, 0, 285, 0, 0, 0, 0, + 0, 0, 0, 0, 155, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 286, 0, 156, 0, 82, 0, 0, + 0, 0, 85, 86, 157, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, + 101, 102, 103, 0, 104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 145, 4, 5, 0, 6, 7, + 8, 0, 0, 146, 0, 0, 147, 0, 9, 10, + 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 0, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 0, 0, 29, 30, + 0, 149, 31, 0, 32, 150, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 0, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, + 154, 0, 63, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 0, 0, 156, 0, 82, 0, 0, 0, 83, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 0, 0, 0, 84, 27, 0, 0, + 0, 0, 145, 4, 5, 0, 6, 7, 8, 0, + 0, 146, 0, 0, 147, 0, 9, 10, 0, 0, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 0, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 0, 0, 29, 30, 0, 149, + 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 0, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, + 63, 285, 0, 0, 0, 0, 0, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, + 0, 156, 0, 82, 0, 0, 0, 83, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 0, 0, 0, 84, 27, 0, 0, 0, 0, + 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, + 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, + 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 341, + 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, + 0, 353, 0, 0, 0, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, + 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, + 0, 0, 84, 27, 0, 0, 0, 0, 145, 4, + 5, 344, 6, 7, 8, 0, 345, 146, 0, 0, + 147, 346, 9, 10, 347, 348, 0, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 349, + 0, 23, 24, 25, 26, 0, 0, 0, 148, 28, + 350, 0, 29, 30, 351, 149, 31, 0, 32, 284, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 151, 0, 0, 352, 0, 0, + 47, 0, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 0, 0, 0, 152, + 62, 0, 0, 153, 154, 0, 63, 285, 0, 353, + 0, 0, 0, 0, 0, 0, 155, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 80, 81, 355, 0, 156, 0, 82, + 0, 0, 356, 83, 85, 86, 157, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 158, 101, 102, 103, 0, 104, 357, 0, 0, + 84, 27, 0, 0, 0, 0, 145, 4, 5, 344, + 6, 7, 8, 0, 345, 146, 0, 0, 147, 346, + 9, 10, 347, 348, 0, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 349, 0, 23, + 24, 25, 26, 0, 0, 0, 148, 28, 350, 0, + 29, 30, 351, 149, 31, 0, 32, 284, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 151, 0, 0, 352, 0, 0, 47, 0, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 0, 0, 0, 152, 62, 0, + 0, 153, 154, 0, 63, 285, 0, 353, 0, 0, + 434, 0, 0, 0, 155, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 355, 0, 156, 0, 82, 0, 0, + 356, 83, 85, 86, 157, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, 100, 158, + 101, 102, 103, 0, 104, 357, 0, 0, 84, 27, + 0, 0, 0, 0, 145, 4, 5, 344, 6, 7, + 8, 0, 345, 146, 0, 0, 147, 346, 9, 10, + 347, 348, 0, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 349, 0, 23, 24, 25, + 26, 0, 0, 0, 148, 28, 350, 0, 29, 30, + 351, 149, 31, 0, 32, 284, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 151, 0, 0, 352, 0, 0, 47, 0, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 0, 0, 0, 152, 62, 0, 0, 153, + 154, 0, 63, 285, 0, 353, 0, 0, 416, 0, + 0, 0, 155, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 355, 0, 156, 0, 82, 0, 0, 356, 83, + 85, 86, 157, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 158, 101, 102, + 103, 0, 104, 357, 0, 0, 84, 27, 0, 0, + 0, 0, 145, 4, 5, 344, 6, 7, 8, 0, + 345, 146, 0, 0, 147, 346, 9, 10, 347, 348, + 0, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 349, 0, 23, 24, 25, 26, 0, + 0, 0, 148, 28, 350, 0, 29, 30, 351, 149, + 31, 0, 32, 284, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 151, 0, + 0, 352, 0, 0, 47, 0, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, + 0, 0, 0, 152, 62, 0, 0, 153, 154, 0, + 63, 285, 0, 353, 0, 0, 354, 0, 0, 0, + 155, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 355, + 0, 156, 0, 82, 0, 0, 356, 83, 85, 86, + 157, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 158, 101, 102, 103, 0, + 104, 357, 0, 0, 84, 27, 0, 0, 0, 0, + 145, 4, 5, 344, 6, 7, 8, 0, 345, 146, + 0, 0, 147, 346, 9, 10, 347, 348, 0, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 349, 0, 23, 24, 25, 26, 0, 0, 0, + 148, 28, 350, 0, 29, 30, 351, 149, 31, 0, + 32, 284, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 151, 0, 0, 352, + 0, 0, 47, 0, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, + 0, 152, 62, 0, 0, 153, 154, 0, 63, 285, + 0, 353, 0, 0, 414, 0, 0, 0, 155, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 355, 0, 156, + 0, 82, 0, 0, 356, 83, 85, 86, 157, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 158, 101, 102, 103, 0, 104, 357, + 0, 0, 84, 27, 0, 0, 0, 0, - 242, 406, 398, 422, 408, 178, 137, 190, 186, 215, - 214, 213, 136, 193, 111, 202, 183, 141, 282, 374, - 419, 372, 340, 302, 283, 262, 261, 335, 330, 382, - 253, 310, 238, 303, 187, 343, 255, 406, 265, 372, - 310, 0, 0, 310, 198, 198, 209, 216, 310, 310, - 198, 310, 0, 198, 0, 198, 198, 198, 198, 218, - 221, 234, 226, 196, 198, 245, 198, 198, 372, 310, - 166, 0, 184, 138, 252, 247, 185, 447, 250, 372, - 444, 198, 198, 372, 230, 440, 318, 417, 315, 236, - 372, 372, 165, 198, 198, 198, 198, 231, 229, 198, - 233, 372, 372, 232, 300, 389, 405, 196, 338, 313, - 166, 166, 0, 198, 372, 0, 0, 0, 401, 166, - 0, 287, 295, 166, 166, 0, 196, 417, 458, 198, - 0, 411, 165, 165, 451, 425, 198, 336, 417, 379, - 337, 165, 196, 300, 268, 165, 165, 164, 0, 196, - 0, 333, 386, 198, 189, 372, 387, 0, 415, 426, - 287, 295, 393, 189, 401, 0, 196, 189, 442, 0, - 0, 0, 432, 389, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, - 0, 395, 0, 413, 0, 0, 392, 0, 0, 0, - 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, - 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; + 242, 406, 398, 422, 408, 178, 137, 190, 186, 215, + 214, 213, 136, 193, 111, 202, 183, 141, 282, 374, + 419, 372, 340, 302, 283, 262, 261, 335, 330, 382, + 253, 310, 238, 303, 187, 343, 255, 406, 265, 372, + 310, 0, 0, 310, 198, 198, 209, 216, 310, 310, + 198, 310, 0, 198, 0, 198, 198, 198, 198, 218, + 221, 234, 226, 196, 198, 245, 198, 198, 372, 310, + 166, 0, 184, 138, 252, 247, 185, 447, 250, 372, + 444, 198, 198, 372, 230, 440, 318, 417, 315, 236, + 372, 372, 165, 198, 198, 198, 198, 231, 229, 198, + 233, 372, 372, 232, 300, 389, 405, 196, 338, 313, + 166, 166, 0, 198, 372, 0, 0, 0, 401, 166, + 0, 287, 295, 166, 166, 0, 196, 417, 458, 198, + 0, 411, 165, 165, 451, 425, 198, 336, 417, 379, + 337, 165, 196, 300, 268, 165, 165, 164, 0, 196, + 0, 333, 386, 198, 189, 372, 387, 0, 415, 426, + 287, 295, 393, 189, 401, 0, 196, 189, 442, 0, + 0, 0, 432, 389, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, + 0, 395, 0, 413, 0, 0, 392, 0, 0, 0, + 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 393, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 389, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 396, + 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 430, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; const short GLSLParserTable::action_check [] = { - 79, 77, 45, 6, 18, 52, 76, 114, 111, 168, - 79, 45, 52, 134, 76, 17, 134, 52, 45, 77, - 134, 112, 79, 79, 45, 79, 79, 112, 114, 134, - 79, 168, 164, 79, 112, 112, 52, 4, 166, 114, - 6, 134, 79, 44, 134, 18, 114, 52, 18, 45, - 134, 164, 52, 134, 79, 52, 45, 52, 0, 114, - 134, 99, 52, 18, 112, 4, 18, 112, 112, 79, - 52, 77, 18, 18, 78, 18, 17, 18, 77, 54, - 18, 52, 18, 45, 52, 78, 78, 1, 2, 21, - 17, 18, 21, 78, 18, 46, 76, 18, 76, 18, - 54, 18, 18, 21, 78, 18, 46, 101, 76, 113, - 54, 45, -1, 107, -1, 77, 104, 54, -1, 56, - 113, 113, -1, 51, 19, -1, -1, 102, 113, -1, - 50, -1, -1, -1, -1, 134, -1, -1, -1, 113, - 50, 104, -1, 77, 104, 79, 97, 135, 102, 137, - 22, -1, -1, 81, 74, -1, 134, 97, 102, 54, - 80, 56, 50, 134, 74, 102, 94, 39, -1, 114, - 80, 114, 135, 105, 137, 135, 105, 137, 114, -1, - -1, -1, 19, 55, -1, -1, 74, 105, 134, 109, - -1, -1, 80, -1, 7, 14, 134, 114, 114, 109, - 3, 114, 5, 16, -1, 77, 19, 102, -1, -1, - 134, -1, -1, 134, 7, 134, 160, 54, -1, 56, - -1, 109, 25, 16, 7, -1, 19, -1, -1, -1, - -1, -1, -1, 16, 47, -1, 19, -1, -1, -1, - -1, 54, 45, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, - -1, 54, -1, -1, 47, 102, -1, -1, -1, 52, - -1, 54, 75, -1, -1, -1, -1, 114, -1, -1, - -1, -1, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, 95, 96, -1, -1, -1, 100, -1, -1, - -1, -1, 115, -1, -1, 98, -1, 110, -1, 102, - 103, -1, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, 115, 136, -1, -1, -1, -1, -1, -1, - -1, -1, 115, -1, -1, -1, -1, 140, -1, -1, - -1, -1, -1, 136, -1, -1, -1, 160, -1, -1, - -1, -1, 145, 136, -1, -1, 7, -1, -1, -1, - -1, -1, 145, -1, 167, 16, -1, 160, 19, -1, - -1, -1, -1, -1, -1, -1, -1, 160, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 102, 103, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 145, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 9, -1, 11, 12, 13, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, - -1, -1, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, -1, -1, 138, -1, -1, -1, -1, 143, 144, - -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, - -1, -1, 51, -1, -1, -1, -1, -1, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, - -1, -1, -1, -1, 143, 144, -1, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 9, -1, 11, 12, - 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, - -1, -1, -1, -1, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - -1, -1, -1, -1, -1, -1, -1, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, -1, -1, 138, -1, -1, -1, -1, - 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 9, -1, 11, 12, 13, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, - -1, 48, -1, -1, 51, 52, -1, -1, -1, -1, - 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, -1, - -1, 138, -1, -1, -1, -1, 143, 144, -1, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, -1, 161, 162, 163, -1, 165, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, - -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, - -1, 21, 22, -1, -1, -1, 26, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, - 40, 41, 42, 43, -1, -1, -1, -1, 48, -1, - -1, 51, 52, -1, -1, 55, -1, 57, -1, 59, - 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, -1, -1, -1, -1, -1, -1, 79, - -1, 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 91, 92, 93, 94, -1, -1, -1, -1, 99, - -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, - 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, - 130, 131, 132, 133, -1, -1, -1, -1, 138, -1, - -1, -1, 142, 143, 144, -1, 146, 147, 148, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -1, 161, 162, 163, -1, 165, -1, -1, -1, 169, - 170, -1, -1, -1, -1, 8, 9, -1, 11, 12, - 13, -1, -1, -1, -1, -1, -1, -1, 21, 22, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, - -1, -1, 55, -1, 57, -1, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, -1, 99, -1, -1, -1, - -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, -1, -1, 138, -1, -1, -1, 142, - 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, - 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, - -1, -1, 8, 9, -1, 11, 12, 13, -1, -1, - -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, - 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, - 36, 37, -1, -1, 40, 41, 42, 43, -1, -1, - -1, -1, 48, -1, -1, 51, 52, -1, -1, 55, - -1, 57, -1, 59, 60, 61, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, - -1, -1, -1, 79, -1, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, - -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, - -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, - 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, -1, -1, - -1, -1, 138, -1, -1, -1, 142, 143, 144, -1, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 156, 157, 158, 159, -1, 161, 162, 163, -1, 165, - -1, -1, -1, 169, 170, -1, -1, -1, -1, 8, - 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, - -1, -1, 21, 22, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, - -1, -1, 51, 52, -1, -1, 55, -1, 57, -1, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, - 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, - 99, -1, -1, -1, -1, -1, 105, -1, -1, -1, - -1, -1, -1, 112, -1, -1, -1, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, - -1, -1, -1, 142, 143, 144, -1, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, - 169, 170, -1, -1, -1, -1, 8, 9, -1, 11, - 12, 13, -1, -1, -1, -1, -1, -1, -1, 21, - 22, -1, -1, -1, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, -1, -1, 40, 41, - 42, 43, -1, -1, -1, -1, 48, -1, -1, 51, - 52, -1, -1, 55, -1, 57, -1, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, - 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, -1, -1, -1, -1, 99, -1, -1, - -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, - 112, -1, -1, -1, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, -1, -1, -1, -1, 138, -1, -1, -1, - 142, 143, 144, -1, 146, 147, 148, 149, 150, 151, - 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, - 162, 163, -1, 165, -1, -1, -1, 169, 170, -1, - -1, -1, -1, 8, 9, -1, 11, 12, 13, -1, - -1, -1, -1, -1, -1, -1, 21, 22, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, -1, 48, -1, -1, 51, 52, -1, -1, - 55, -1, 57, -1, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, - -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, - 105, -1, -1, -1, -1, -1, -1, 112, -1, -1, - -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, -1, -1, 138, -1, -1, -1, 142, 143, 144, - -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, - 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, - 8, 9, -1, 11, 12, 13, -1, -1, -1, -1, - -1, -1, -1, 21, 22, -1, -1, -1, 26, 27, - 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - -1, -1, 40, 41, 42, 43, -1, -1, -1, -1, - 48, -1, -1, 51, 52, -1, -1, 55, -1, 57, - -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, - -1, 79, -1, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, - -1, 99, -1, -1, -1, -1, -1, 105, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, - 128, 129, 130, 131, 132, 133, 134, -1, -1, -1, - 138, -1, -1, -1, 142, 143, 144, -1, 146, 147, - 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, -1, 161, 162, 163, -1, 165, -1, -1, - -1, 169, 170, -1, -1, -1, -1, 8, 9, -1, - 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, - 21, 22, -1, -1, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, - 41, 42, 43, -1, -1, -1, -1, 48, -1, -1, - 51, 52, -1, -1, 55, -1, 57, -1, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, -1, -1, -1, -1, -1, -1, 79, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, -1, 99, -1, - -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, - -1, 112, -1, -1, -1, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, -1, -1, -1, -1, 138, -1, -1, - -1, 142, 143, 144, -1, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, -1, - 161, 162, 163, -1, 165, -1, -1, -1, 169, 170, - -1, -1, -1, -1, 7, -1, 9, -1, 11, 12, - 13, -1, -1, 16, -1, -1, 19, -1, -1, -1, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, -1, -1, 51, -1, - -1, 54, -1, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, -1, -1, -1, 102, - 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, 136, -1, 138, -1, -1, -1, -1, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 7, -1, 9, -1, 11, 12, 13, -1, - -1, 16, -1, -1, 19, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, -1, -1, 51, -1, -1, 54, - -1, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, -1, -1, -1, -1, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, -1, -1, -1, 102, 103, -1, - -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, - -1, 136, -1, 138, -1, -1, -1, -1, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 7, -1, 9, -1, 11, 12, 13, -1, -1, 16, - -1, -1, 19, -1, -1, -1, -1, -1, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, -1, -1, 51, -1, -1, 54, -1, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, - -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, -1, -1, -1, 102, 103, -1, -1, -1, - -1, -1, -1, -1, 111, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, -1, -1, 136, - -1, 138, -1, -1, -1, -1, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, - 9, -1, 11, 12, 13, -1, -1, 16, -1, -1, - 19, -1, -1, -1, -1, -1, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, - -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, - -1, -1, 51, -1, -1, 54, -1, -1, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, - -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, - -1, -1, -1, 102, 103, -1, -1, -1, -1, -1, - -1, -1, 111, -1, -1, -1, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, -1, -1, 136, -1, 138, - -1, -1, -1, -1, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, 165, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 7, -1, 9, -1, - 11, 12, 13, -1, -1, 16, -1, -1, 19, -1, - -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, - 41, 42, 43, -1, -1, -1, 47, 48, -1, -1, - 51, -1, -1, 54, -1, -1, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, -1, -1, -1, -1, -1, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, 98, -1, -1, - -1, 102, 103, -1, -1, 106, -1, -1, -1, -1, - -1, -1, -1, -1, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, - -1, -1, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, 165, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 7, 8, 9, -1, 11, 12, - 13, -1, -1, 16, -1, -1, 19, -1, 21, 22, - -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, -1, -1, 51, 52, - -1, 54, 55, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, -1, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, - 103, -1, 105, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, -1, -1, 136, -1, 138, -1, -1, -1, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, - -1, -1, 7, 8, 9, -1, 11, 12, 13, -1, - -1, 16, -1, -1, 19, -1, 21, 22, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, -1, -1, 51, 52, -1, 54, - 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, - 105, 106, -1, -1, -1, -1, -1, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - -1, 136, -1, 138, -1, -1, -1, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, - 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, - -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, - -1, 108, -1, -1, -1, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, - -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, - -1, -1, 169, 170, -1, -1, -1, -1, 7, 8, - 9, 10, 11, 12, 13, -1, 15, 16, -1, -1, - 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, - 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, - 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, 72, 73, -1, -1, 76, -1, -1, - 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, - 99, -1, -1, 102, 103, -1, 105, 106, -1, 108, - -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, - 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, -1, 136, -1, 138, - -1, -1, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, -1, 165, 166, -1, -1, - 169, 170, -1, -1, -1, -1, 7, 8, 9, 10, - 11, 12, 13, -1, 15, 16, -1, -1, 19, 20, - 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, -1, -1, 47, 48, 49, -1, - 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, -1, -1, 76, -1, -1, 79, -1, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, -1, -1, -1, 98, 99, -1, - -1, 102, 103, -1, 105, 106, -1, 108, -1, -1, - 111, -1, -1, -1, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, - 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, - 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, - 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, -1, 165, 166, -1, -1, 169, 170, - -1, -1, -1, -1, 7, 8, 9, 10, 11, 12, - 13, -1, 15, 16, -1, -1, 19, 20, 21, 22, - 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, -1, -1, 47, 48, 49, -1, 51, 52, - 53, 54, 55, -1, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, -1, -1, 76, -1, -1, 79, -1, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, - 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, - 103, -1, 105, 106, -1, 108, -1, -1, 111, -1, - -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 134, -1, 136, -1, 138, -1, -1, 141, 142, - 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, - 163, -1, 165, 166, -1, -1, 169, 170, -1, -1, - -1, -1, 7, 8, 9, 10, 11, 12, 13, -1, - 15, 16, -1, -1, 19, 20, 21, 22, 23, 24, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, - -1, -1, 47, 48, 49, -1, 51, 52, 53, 54, - 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, - -1, 76, -1, -1, 79, -1, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, - 105, 106, -1, 108, -1, -1, 111, -1, -1, -1, - 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, - -1, 136, -1, 138, -1, -1, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, - 165, 166, -1, -1, 169, 170, -1, -1, -1, -1, - 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, - -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, - 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, - -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, - -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, - -1, 108, -1, -1, 111, -1, -1, -1, 115, 116, - 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, - 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, - -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, - 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, - -1, -1, 169, 170, -1, -1, -1, -1, + 79, 77, 45, 6, 18, 52, 76, 114, 111, 168, + 79, 45, 52, 134, 76, 17, 134, 52, 45, 77, + 134, 112, 79, 79, 45, 79, 79, 112, 114, 134, + 79, 168, 164, 79, 112, 112, 52, 4, 166, 114, + 6, 134, 79, 44, 134, 18, 114, 52, 18, 45, + 134, 164, 52, 134, 79, 52, 45, 52, 0, 114, + 134, 99, 52, 18, 112, 4, 18, 112, 112, 79, + 52, 77, 18, 18, 78, 18, 17, 18, 77, 54, + 18, 52, 18, 45, 52, 78, 78, 1, 2, 21, + 17, 18, 21, 78, 18, 46, 76, 18, 76, 18, + 54, 18, 18, 21, 78, 18, 46, 101, 76, 113, + 54, 45, -1, 107, -1, 77, 104, 54, -1, 56, + 113, 113, -1, 51, 19, -1, -1, 102, 113, -1, + 50, -1, -1, -1, -1, 134, -1, -1, -1, 113, + 50, 104, -1, 77, 104, 79, 97, 135, 102, 137, + 22, -1, -1, 81, 74, -1, 134, 97, 102, 54, + 80, 56, 50, 134, 74, 102, 94, 39, -1, 114, + 80, 114, 135, 105, 137, 135, 105, 137, 114, -1, + -1, -1, 19, 55, -1, -1, 74, 105, 134, 109, + -1, -1, 80, -1, 7, 14, 134, 114, 114, 109, + 3, 114, 5, 16, -1, 77, 19, 102, -1, -1, + 134, -1, -1, 134, 7, 134, 160, 54, -1, 56, + -1, 109, 25, 16, 7, -1, 19, -1, -1, -1, + -1, -1, -1, 16, 47, -1, 19, -1, -1, -1, + -1, 54, 45, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, + -1, 54, -1, -1, 47, 102, -1, -1, -1, 52, + -1, 54, 75, -1, -1, -1, -1, 114, -1, -1, + -1, -1, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, 95, 96, -1, -1, -1, 100, -1, -1, + -1, -1, 115, -1, -1, 98, -1, 110, -1, 102, + 103, -1, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, 115, 136, -1, -1, -1, -1, -1, -1, + -1, -1, 115, -1, -1, -1, -1, 140, -1, -1, + -1, -1, -1, 136, -1, -1, -1, 160, -1, -1, + -1, -1, 145, 136, -1, -1, 7, -1, -1, -1, + -1, -1, 145, -1, 167, 16, -1, 160, 19, -1, + -1, -1, -1, -1, -1, -1, -1, 160, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 102, 103, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 115, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 145, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 160, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 9, -1, 11, 12, 13, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, -1, -1, 138, -1, -1, -1, -1, 143, 144, + -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, + -1, -1, 51, -1, -1, -1, -1, -1, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, + -1, -1, -1, -1, 143, 144, -1, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 9, -1, 11, 12, + 13, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, + -1, -1, -1, -1, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, -1, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, -1, -1, 138, -1, -1, -1, -1, + 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, + 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 9, -1, 11, 12, 13, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, + -1, 48, -1, -1, 51, 52, -1, -1, -1, -1, + 57, -1, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, -1, -1, -1, -1, + -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, -1, + -1, 138, -1, -1, -1, -1, 143, 144, -1, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, -1, 161, 162, 163, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 8, 9, + -1, 11, 12, 13, -1, -1, -1, -1, -1, -1, + -1, 21, 22, -1, -1, -1, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, -1, -1, + 40, 41, 42, 43, -1, -1, -1, -1, 48, -1, + -1, 51, 52, -1, -1, 55, -1, 57, -1, 59, + 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, -1, -1, -1, -1, -1, -1, 79, + -1, 81, 82, 83, 84, 85, 86, 87, 88, 89, + 90, 91, 92, 93, 94, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, 105, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, -1, -1, -1, -1, 138, -1, + -1, -1, 142, 143, 144, -1, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, + -1, 161, 162, 163, -1, 165, -1, -1, -1, 169, + 170, -1, -1, -1, -1, 8, 9, -1, 11, 12, + 13, -1, -1, -1, -1, -1, -1, -1, 21, 22, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, -1, 48, -1, -1, 51, 52, + -1, -1, 55, -1, 57, -1, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + -1, -1, -1, -1, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, 105, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, -1, -1, 138, -1, -1, -1, 142, + 143, 144, -1, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, -1, 161, 162, + 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, + -1, -1, 8, 9, -1, 11, 12, 13, -1, -1, + -1, -1, -1, -1, -1, 21, 22, -1, -1, -1, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, -1, -1, 40, 41, 42, 43, -1, -1, + -1, -1, 48, -1, -1, 51, 52, -1, -1, 55, + -1, 57, -1, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, -1, -1, -1, + -1, -1, -1, 79, -1, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, 105, + -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, -1, -1, + -1, -1, 138, -1, -1, -1, 142, 143, 144, -1, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, -1, 161, 162, 163, -1, 165, + -1, -1, -1, 169, 170, -1, -1, -1, -1, 8, + 9, -1, 11, 12, 13, -1, -1, -1, -1, -1, + -1, -1, 21, 22, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, -1, 48, + -1, -1, 51, 52, -1, -1, 55, -1, 57, -1, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, -1, -1, -1, -1, -1, -1, + 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, 105, -1, -1, -1, + -1, -1, -1, 112, -1, -1, -1, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, -1, -1, 138, + -1, -1, -1, 142, 143, 144, -1, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, -1, 161, 162, 163, -1, 165, -1, -1, -1, + 169, 170, -1, -1, -1, -1, 8, 9, -1, 11, + 12, 13, -1, -1, -1, -1, -1, -1, -1, 21, + 22, -1, -1, -1, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, -1, -1, 40, 41, + 42, 43, -1, -1, -1, -1, 48, -1, -1, 51, + 52, -1, -1, 55, -1, 57, -1, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, -1, -1, -1, -1, -1, -1, 79, -1, 81, + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, 105, -1, -1, -1, -1, -1, -1, + 112, -1, -1, -1, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 132, 133, -1, -1, -1, -1, 138, -1, -1, -1, + 142, 143, 144, -1, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, -1, 161, + 162, 163, -1, 165, -1, -1, -1, 169, 170, -1, + -1, -1, -1, 8, 9, -1, 11, 12, 13, -1, + -1, -1, -1, -1, -1, -1, 21, 22, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, -1, 48, -1, -1, 51, 52, -1, -1, + 55, -1, 57, -1, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, -1, -1, + -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + 105, -1, -1, -1, -1, -1, -1, 112, -1, -1, + -1, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, -1, -1, 138, -1, -1, -1, 142, 143, 144, + -1, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, -1, 161, 162, 163, -1, + 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, + 8, 9, -1, 11, 12, 13, -1, -1, -1, -1, + -1, -1, -1, 21, 22, -1, -1, -1, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, + -1, -1, 40, 41, 42, 43, -1, -1, -1, -1, + 48, -1, -1, 51, 52, -1, -1, 55, -1, 57, + -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, -1, -1, -1, -1, -1, + -1, 79, -1, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, 105, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, -1, -1, -1, + 138, -1, -1, -1, 142, 143, 144, -1, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, + 158, 159, -1, 161, 162, 163, -1, 165, -1, -1, + -1, 169, 170, -1, -1, -1, -1, 8, 9, -1, + 11, 12, 13, -1, -1, -1, -1, -1, -1, -1, + 21, 22, -1, -1, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, + 41, 42, 43, -1, -1, -1, -1, 48, -1, -1, + 51, 52, -1, -1, 55, -1, 57, -1, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, -1, -1, -1, -1, -1, -1, 79, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, 105, -1, -1, -1, -1, -1, + -1, 112, -1, -1, -1, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, -1, -1, -1, -1, 138, -1, -1, + -1, 142, 143, 144, -1, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, -1, + 161, 162, 163, -1, 165, -1, -1, -1, 169, 170, + -1, -1, -1, -1, 7, -1, 9, -1, 11, 12, + 13, -1, -1, 16, -1, -1, 19, -1, -1, -1, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, -1, -1, 51, -1, + -1, 54, -1, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, -1, -1, -1, -1, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, -1, -1, -1, 102, + 103, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, 136, -1, 138, -1, -1, -1, -1, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 7, -1, 9, -1, 11, 12, 13, -1, + -1, 16, -1, -1, 19, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, -1, -1, 51, -1, -1, 54, + -1, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, -1, -1, -1, -1, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, -1, -1, -1, 102, 103, -1, + -1, -1, -1, -1, -1, -1, 111, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, -1, + -1, 136, -1, 138, -1, -1, -1, -1, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 7, -1, 9, -1, 11, 12, 13, -1, -1, 16, + -1, -1, 19, -1, -1, -1, -1, -1, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, -1, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, -1, -1, 51, -1, -1, 54, -1, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, -1, + -1, -1, -1, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, -1, -1, -1, 102, 103, -1, -1, -1, + -1, -1, -1, -1, 111, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, -1, -1, 136, + -1, 138, -1, -1, -1, -1, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 7, -1, + 9, -1, 11, 12, 13, -1, -1, 16, -1, -1, + 19, -1, -1, -1, -1, -1, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, -1, + -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, + -1, -1, 51, -1, -1, 54, -1, -1, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, -1, -1, -1, -1, + -1, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, + -1, -1, -1, 102, 103, -1, -1, -1, -1, -1, + -1, -1, 111, -1, -1, -1, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, -1, -1, 136, -1, 138, + -1, -1, -1, -1, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 7, -1, 9, -1, + 11, 12, 13, -1, -1, 16, -1, -1, 19, -1, + -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, -1, -1, 40, + 41, 42, 43, -1, -1, -1, 47, 48, -1, -1, + 51, -1, -1, 54, -1, -1, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, -1, -1, -1, -1, -1, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, 98, -1, -1, + -1, 102, 103, -1, -1, 106, -1, -1, -1, -1, + -1, -1, -1, -1, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, + -1, -1, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 7, 8, 9, -1, 11, 12, + 13, -1, -1, 16, -1, -1, 19, -1, 21, 22, + -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, -1, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, -1, -1, 51, 52, + -1, 54, 55, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, -1, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, + 103, -1, 105, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, -1, -1, 136, -1, 138, -1, -1, -1, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, -1, -1, -1, 169, 170, -1, -1, + -1, -1, 7, 8, 9, -1, 11, 12, 13, -1, + -1, 16, -1, -1, 19, -1, 21, 22, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, -1, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, -1, -1, 51, 52, -1, 54, + 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, -1, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, + 105, 106, -1, -1, -1, -1, -1, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + -1, 136, -1, 138, -1, -1, -1, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, -1, -1, -1, 169, 170, -1, -1, -1, -1, + 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, + -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, + -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, + -1, 108, -1, -1, -1, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, + -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, + -1, -1, 169, 170, -1, -1, -1, -1, 7, 8, + 9, 10, 11, 12, 13, -1, 15, 16, -1, -1, + 19, 20, 21, 22, 23, 24, -1, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + -1, 40, 41, 42, 43, -1, -1, -1, 47, 48, + 49, -1, 51, 52, 53, 54, 55, -1, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, -1, -1, 76, -1, -1, + 79, -1, 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, -1, -1, -1, 98, + 99, -1, -1, 102, 103, -1, 105, 106, -1, 108, + -1, -1, -1, -1, -1, -1, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, -1, 136, -1, 138, + -1, -1, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, -1, 165, 166, -1, -1, + 169, 170, -1, -1, -1, -1, 7, 8, 9, 10, + 11, 12, 13, -1, 15, 16, -1, -1, 19, 20, + 21, 22, 23, 24, -1, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, -1, 40, + 41, 42, 43, -1, -1, -1, 47, 48, 49, -1, + 51, 52, 53, 54, 55, -1, 57, 58, 59, 60, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, -1, -1, 76, -1, -1, 79, -1, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, -1, -1, -1, 98, 99, -1, + -1, 102, 103, -1, 105, 106, -1, 108, -1, -1, + 111, -1, -1, -1, 115, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, -1, 136, -1, 138, -1, -1, + 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, -1, 165, 166, -1, -1, 169, 170, + -1, -1, -1, -1, 7, 8, 9, 10, 11, 12, + 13, -1, 15, 16, -1, -1, 19, 20, 21, 22, + 23, 24, -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, -1, 40, 41, 42, + 43, -1, -1, -1, 47, 48, 49, -1, 51, 52, + 53, 54, 55, -1, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, -1, -1, 76, -1, -1, 79, -1, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, -1, -1, -1, 98, 99, -1, -1, 102, + 103, -1, 105, 106, -1, 108, -1, -1, 111, -1, + -1, -1, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, -1, 136, -1, 138, -1, -1, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, -1, 165, 166, -1, -1, 169, 170, -1, -1, + -1, -1, 7, 8, 9, 10, 11, 12, 13, -1, + 15, 16, -1, -1, 19, 20, 21, 22, 23, 24, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, + -1, -1, 47, 48, 49, -1, 51, 52, 53, 54, + 55, -1, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + -1, 76, -1, -1, 79, -1, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + -1, -1, -1, 98, 99, -1, -1, 102, 103, -1, + 105, 106, -1, 108, -1, -1, 111, -1, -1, -1, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + -1, 136, -1, 138, -1, -1, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, -1, + 165, 166, -1, -1, 169, 170, -1, -1, -1, -1, + 7, 8, 9, 10, 11, 12, 13, -1, 15, 16, + -1, -1, 19, 20, 21, 22, 23, 24, -1, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, -1, 40, 41, 42, 43, -1, -1, -1, + 47, 48, 49, -1, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, -1, 76, + -1, -1, 79, -1, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 94, -1, -1, + -1, 98, 99, -1, -1, 102, 103, -1, 105, 106, + -1, 108, -1, -1, 111, -1, -1, -1, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, -1, 136, + -1, 138, -1, -1, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, -1, 165, 166, + -1, -1, 169, 170, -1, -1, -1, -1, - 12, 14, 3, 3, 3, 54, 15, 14, 55, 15, - 15, 15, 15, 59, 3, 60, 55, 12, 12, 3, - 3, 14, 41, 34, 15, 3, 8, 45, 14, 3, - 3, 12, 12, 35, 55, 73, 12, 14, 35, 14, - 12, -1, -1, 12, 15, 15, 17, 17, 12, 12, - 15, 12, -1, 15, -1, 15, 15, 15, 15, 21, - 20, 20, 19, 28, 15, 23, 15, 15, 14, 12, - 14, -1, 51, 3, 25, 24, 55, 49, 26, 14, - 49, 15, 15, 14, 18, 49, 49, 62, 49, 22, - 14, 14, 36, 15, 15, 15, 15, 19, 18, 15, - 19, 14, 14, 19, 14, 14, 49, 28, 14, 30, - 14, 14, -1, 15, 14, -1, -1, -1, 64, 14, - -1, 31, 32, 14, 14, -1, 28, 62, 30, 15, - -1, 62, 36, 36, 37, 47, 15, 43, 62, 62, - 46, 36, 28, 14, 30, 36, 36, 37, -1, 28, - -1, 30, 61, 15, 58, 14, 65, -1, 71, 71, - 31, 32, 3, 58, 64, -1, 28, 58, 30, -1, - -1, -1, 72, 14, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, - -1, 42, -1, 62, -1, -1, 47, -1, -1, -1, - -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, - -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, - -1, -1, -1, -1, -1, -1, -1, -1 -}; + 12, 14, 3, 3, 3, 54, 15, 14, 55, 15, + 15, 15, 15, 59, 3, 60, 55, 12, 12, 3, + 3, 14, 41, 34, 15, 3, 8, 45, 14, 3, + 3, 12, 12, 35, 55, 73, 12, 14, 35, 14, + 12, -1, -1, 12, 15, 15, 17, 17, 12, 12, + 15, 12, -1, 15, -1, 15, 15, 15, 15, 21, + 20, 20, 19, 28, 15, 23, 15, 15, 14, 12, + 14, -1, 51, 3, 25, 24, 55, 49, 26, 14, + 49, 15, 15, 14, 18, 49, 49, 62, 49, 22, + 14, 14, 36, 15, 15, 15, 15, 19, 18, 15, + 19, 14, 14, 19, 14, 14, 49, 28, 14, 30, + 14, 14, -1, 15, 14, -1, -1, -1, 64, 14, + -1, 31, 32, 14, 14, -1, 28, 62, 30, 15, + -1, 62, 36, 36, 37, 47, 15, 43, 62, 62, + 46, 36, 28, 14, 30, 36, 36, 37, -1, 28, + -1, 30, 61, 15, 58, 14, 65, -1, 71, 71, + 31, 32, 3, 58, 64, -1, 28, 58, 30, -1, + -1, -1, 72, 14, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 36, -1, -1, -1, -1, + -1, 42, -1, 62, -1, -1, 47, -1, -1, -1, + -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 14, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, + -1, -1, -1, -1, -1, 42, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 75, -1, + -1, -1, -1, -1, -1, -1, -1, -1}; QT_END_NAMESPACE diff --git a/src/libs/glsl/glslparsertable_p.h b/src/libs/glsl/glslparsertable_p.h index 8abd1157353..7c298263cd8 100644 --- a/src/libs/glsl/glslparsertable_p.h +++ b/src/libs/glsl/glslparsertable_p.h @@ -1,26 +1,31 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ +** Contact: http://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** $QT_BEGIN_LICENSE:LGPL21$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. ** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** As a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** $QT_END_LICENSE$ ** @@ -48,221 +53,221 @@ QT_BEGIN_NAMESPACE class GLSLParserTable { public: - enum VariousConstants { - EOF_SYMBOL = 0, - T_ADD_ASSIGN = 3, - T_AMPERSAND = 4, - T_AND_ASSIGN = 5, - T_AND_OP = 6, - T_ATTRIBUTE = 7, - T_BANG = 8, - T_BOOL = 9, - T_BREAK = 10, - T_BVEC2 = 11, - T_BVEC3 = 12, - T_BVEC4 = 13, - T_CARET = 14, - T_CASE = 15, - T_CENTROID = 16, - T_COLON = 17, - T_COMMA = 18, - T_COMMENT = 172, - T_CONST = 19, - T_CONTINUE = 20, - T_DASH = 21, - T_DEC_OP = 22, - T_DEFAULT = 23, - T_DISCARD = 24, - T_DIV_ASSIGN = 25, - T_DMAT2 = 26, - T_DMAT2X2 = 27, - T_DMAT2X3 = 28, - T_DMAT2X4 = 29, - T_DMAT3 = 30, - T_DMAT3X2 = 31, - T_DMAT3X3 = 32, - T_DMAT3X4 = 33, - T_DMAT4 = 34, - T_DMAT4X2 = 35, - T_DMAT4X3 = 36, - T_DMAT4X4 = 37, - T_DO = 38, - T_DOT = 39, - T_DOUBLE = 40, - T_DVEC2 = 41, - T_DVEC3 = 42, - T_DVEC4 = 43, - T_ELSE = 44, - T_EQUAL = 45, - T_EQ_OP = 46, - T_ERROR = 173, - T_FALSE = 170, - T_FEED_EXPRESSION = 2, - T_FEED_GLSL = 1, - T_FLAT = 47, - T_FLOAT = 48, - T_FOR = 49, - T_GE_OP = 50, - T_HIGHP = 51, - T_IDENTIFIER = 52, - T_IF = 53, - T_IN = 54, - T_INC_OP = 55, - T_INOUT = 56, - T_INT = 57, - T_INVARIANT = 58, - T_ISAMPLER1D = 59, - T_ISAMPLER1DARRAY = 60, - T_ISAMPLER2D = 61, - T_ISAMPLER2DARRAY = 62, - T_ISAMPLER2DMS = 63, - T_ISAMPLER2DMSARRAY = 64, - T_ISAMPLER2DRECT = 65, - T_ISAMPLER3D = 66, - T_ISAMPLERBUFFER = 67, - T_ISAMPLERCUBE = 68, - T_ISAMPLERCUBEARRAY = 69, - T_IVEC2 = 70, - T_IVEC3 = 71, - T_IVEC4 = 72, - T_LAYOUT = 73, - T_LEFT_ANGLE = 74, - T_LEFT_ASSIGN = 75, - T_LEFT_BRACE = 76, - T_LEFT_BRACKET = 77, - T_LEFT_OP = 78, - T_LEFT_PAREN = 79, - T_LE_OP = 80, - T_LOWP = 81, - T_MAT2 = 82, - T_MAT2X2 = 83, - T_MAT2X3 = 84, - T_MAT2X4 = 85, - T_MAT3 = 86, - T_MAT3X2 = 87, - T_MAT3X3 = 88, - T_MAT3X4 = 89, - T_MAT4 = 90, - T_MAT4X2 = 91, - T_MAT4X3 = 92, - T_MAT4X4 = 93, - T_MEDIUMP = 94, - T_MOD_ASSIGN = 95, - T_MUL_ASSIGN = 96, - T_NE_OP = 97, - T_NOPERSPECTIVE = 98, - T_NUMBER = 99, - T_OR_ASSIGN = 100, - T_OR_OP = 101, - T_OUT = 102, - T_PATCH = 103, - T_PERCENT = 104, - T_PLUS = 105, - T_PRECISION = 106, - T_PREPROC = 171, - T_QUESTION = 107, - T_RESERVED = 174, - T_RETURN = 108, - T_RIGHT_ANGLE = 109, - T_RIGHT_ASSIGN = 110, - T_RIGHT_BRACE = 111, - T_RIGHT_BRACKET = 112, - T_RIGHT_OP = 113, - T_RIGHT_PAREN = 114, - T_SAMPLE = 115, - T_SAMPLER1D = 116, - T_SAMPLER1DARRAY = 117, - T_SAMPLER1DARRAYSHADOW = 118, - T_SAMPLER1DSHADOW = 119, - T_SAMPLER2D = 120, - T_SAMPLER2DARRAY = 121, - T_SAMPLER2DARRAYSHADOW = 122, - T_SAMPLER2DMS = 123, - T_SAMPLER2DMSARRAY = 124, - T_SAMPLER2DRECT = 125, - T_SAMPLER2DRECTSHADOW = 126, - T_SAMPLER2DSHADOW = 127, - T_SAMPLER3D = 128, - T_SAMPLERBUFFER = 129, - T_SAMPLERCUBE = 130, - T_SAMPLERCUBEARRAY = 131, - T_SAMPLERCUBEARRAYSHADOW = 132, - T_SAMPLERCUBESHADOW = 133, - T_SEMICOLON = 134, - T_SLASH = 135, - T_SMOOTH = 136, - T_STAR = 137, - T_STRUCT = 138, - T_SUBROUTINE = 139, - T_SUB_ASSIGN = 140, - T_SWITCH = 141, - T_TILDE = 142, - T_TRUE = 169, - T_TYPE_NAME = 143, - T_UINT = 144, - T_UNIFORM = 145, - T_USAMPLER1D = 146, - T_USAMPLER1DARRAY = 147, - T_USAMPLER2D = 148, - T_USAMPLER2DARRAY = 149, - T_USAMPLER2DMS = 150, - T_USAMPLER2DMSARRAY = 151, - T_USAMPLER2DRECT = 152, - T_USAMPLER3D = 153, - T_USAMPLERBUFFER = 154, - T_USAMPLERCUBE = 155, - T_USAMPLERCUBEARRAY = 156, - T_UVEC2 = 157, - T_UVEC3 = 158, - T_UVEC4 = 159, - T_VARYING = 160, - T_VEC2 = 161, - T_VEC3 = 162, - T_VEC4 = 163, - T_VERTICAL_BAR = 164, - T_VOID = 165, - T_WHILE = 166, - T_XOR_ASSIGN = 167, - T_XOR_OP = 168, + enum VariousConstants { + EOF_SYMBOL = 0, + T_ADD_ASSIGN = 3, + T_AMPERSAND = 4, + T_AND_ASSIGN = 5, + T_AND_OP = 6, + T_ATTRIBUTE = 7, + T_BANG = 8, + T_BOOL = 9, + T_BREAK = 10, + T_BVEC2 = 11, + T_BVEC3 = 12, + T_BVEC4 = 13, + T_CARET = 14, + T_CASE = 15, + T_CENTROID = 16, + T_COLON = 17, + T_COMMA = 18, + T_COMMENT = 172, + T_CONST = 19, + T_CONTINUE = 20, + T_DASH = 21, + T_DEC_OP = 22, + T_DEFAULT = 23, + T_DISCARD = 24, + T_DIV_ASSIGN = 25, + T_DMAT2 = 26, + T_DMAT2X2 = 27, + T_DMAT2X3 = 28, + T_DMAT2X4 = 29, + T_DMAT3 = 30, + T_DMAT3X2 = 31, + T_DMAT3X3 = 32, + T_DMAT3X4 = 33, + T_DMAT4 = 34, + T_DMAT4X2 = 35, + T_DMAT4X3 = 36, + T_DMAT4X4 = 37, + T_DO = 38, + T_DOT = 39, + T_DOUBLE = 40, + T_DVEC2 = 41, + T_DVEC3 = 42, + T_DVEC4 = 43, + T_ELSE = 44, + T_EQUAL = 45, + T_EQ_OP = 46, + T_ERROR = 173, + T_FALSE = 170, + T_FEED_EXPRESSION = 2, + T_FEED_GLSL = 1, + T_FLAT = 47, + T_FLOAT = 48, + T_FOR = 49, + T_GE_OP = 50, + T_HIGHP = 51, + T_IDENTIFIER = 52, + T_IF = 53, + T_IN = 54, + T_INC_OP = 55, + T_INOUT = 56, + T_INT = 57, + T_INVARIANT = 58, + T_ISAMPLER1D = 59, + T_ISAMPLER1DARRAY = 60, + T_ISAMPLER2D = 61, + T_ISAMPLER2DARRAY = 62, + T_ISAMPLER2DMS = 63, + T_ISAMPLER2DMSARRAY = 64, + T_ISAMPLER2DRECT = 65, + T_ISAMPLER3D = 66, + T_ISAMPLERBUFFER = 67, + T_ISAMPLERCUBE = 68, + T_ISAMPLERCUBEARRAY = 69, + T_IVEC2 = 70, + T_IVEC3 = 71, + T_IVEC4 = 72, + T_LAYOUT = 73, + T_LEFT_ANGLE = 74, + T_LEFT_ASSIGN = 75, + T_LEFT_BRACE = 76, + T_LEFT_BRACKET = 77, + T_LEFT_OP = 78, + T_LEFT_PAREN = 79, + T_LE_OP = 80, + T_LOWP = 81, + T_MAT2 = 82, + T_MAT2X2 = 83, + T_MAT2X3 = 84, + T_MAT2X4 = 85, + T_MAT3 = 86, + T_MAT3X2 = 87, + T_MAT3X3 = 88, + T_MAT3X4 = 89, + T_MAT4 = 90, + T_MAT4X2 = 91, + T_MAT4X3 = 92, + T_MAT4X4 = 93, + T_MEDIUMP = 94, + T_MOD_ASSIGN = 95, + T_MUL_ASSIGN = 96, + T_NE_OP = 97, + T_NOPERSPECTIVE = 98, + T_NUMBER = 99, + T_OR_ASSIGN = 100, + T_OR_OP = 101, + T_OUT = 102, + T_PATCH = 103, + T_PERCENT = 104, + T_PLUS = 105, + T_PRECISION = 106, + T_PREPROC = 171, + T_QUESTION = 107, + T_RESERVED = 174, + T_RETURN = 108, + T_RIGHT_ANGLE = 109, + T_RIGHT_ASSIGN = 110, + T_RIGHT_BRACE = 111, + T_RIGHT_BRACKET = 112, + T_RIGHT_OP = 113, + T_RIGHT_PAREN = 114, + T_SAMPLE = 115, + T_SAMPLER1D = 116, + T_SAMPLER1DARRAY = 117, + T_SAMPLER1DARRAYSHADOW = 118, + T_SAMPLER1DSHADOW = 119, + T_SAMPLER2D = 120, + T_SAMPLER2DARRAY = 121, + T_SAMPLER2DARRAYSHADOW = 122, + T_SAMPLER2DMS = 123, + T_SAMPLER2DMSARRAY = 124, + T_SAMPLER2DRECT = 125, + T_SAMPLER2DRECTSHADOW = 126, + T_SAMPLER2DSHADOW = 127, + T_SAMPLER3D = 128, + T_SAMPLERBUFFER = 129, + T_SAMPLERCUBE = 130, + T_SAMPLERCUBEARRAY = 131, + T_SAMPLERCUBEARRAYSHADOW = 132, + T_SAMPLERCUBESHADOW = 133, + T_SEMICOLON = 134, + T_SLASH = 135, + T_SMOOTH = 136, + T_STAR = 137, + T_STRUCT = 138, + T_SUBROUTINE = 139, + T_SUB_ASSIGN = 140, + T_SWITCH = 141, + T_TILDE = 142, + T_TRUE = 169, + T_TYPE_NAME = 143, + T_UINT = 144, + T_UNIFORM = 145, + T_USAMPLER1D = 146, + T_USAMPLER1DARRAY = 147, + T_USAMPLER2D = 148, + T_USAMPLER2DARRAY = 149, + T_USAMPLER2DMS = 150, + T_USAMPLER2DMSARRAY = 151, + T_USAMPLER2DRECT = 152, + T_USAMPLER3D = 153, + T_USAMPLERBUFFER = 154, + T_USAMPLERCUBE = 155, + T_USAMPLERCUBEARRAY = 156, + T_UVEC2 = 157, + T_UVEC3 = 158, + T_UVEC4 = 159, + T_VARYING = 160, + T_VEC2 = 161, + T_VEC3 = 162, + T_VEC4 = 163, + T_VERTICAL_BAR = 164, + T_VOID = 165, + T_WHILE = 166, + T_XOR_ASSIGN = 167, + T_XOR_OP = 168, - ACCEPT_STATE = 462, - RULE_COUNT = 316, - STATE_COUNT = 463, - TERMINAL_COUNT = 175, - NON_TERMINAL_COUNT = 85, + ACCEPT_STATE = 462, + RULE_COUNT = 316, + STATE_COUNT = 463, + TERMINAL_COUNT = 175, + NON_TERMINAL_COUNT = 85, - GOTO_INDEX_OFFSET = 463, - GOTO_INFO_OFFSET = 4708, - GOTO_CHECK_OFFSET = 4708 - }; + GOTO_INDEX_OFFSET = 463, + GOTO_INFO_OFFSET = 4708, + GOTO_CHECK_OFFSET = 4708 + }; - static const char *const spell[]; - static const short lhs[]; - static const short rhs[]; - static const short goto_default[]; - static const short action_default[]; - static const short action_index[]; - static const short action_info[]; - static const short action_check[]; + static const char *const spell []; + static const short lhs []; + static const short rhs []; + static const short goto_default []; + static const short action_default []; + static const short action_index []; + static const short action_info []; + static const short action_check []; - static inline int nt_action (int state, int nt) - { - const int yyn = action_index [GOTO_INDEX_OFFSET + state] + nt; - if (yyn < 0 || action_check [GOTO_CHECK_OFFSET + yyn] != nt) - return goto_default [nt]; + static inline int nt_action (int state, int nt) + { + const int yyn = action_index [GOTO_INDEX_OFFSET + state] + nt; + if (yyn < 0 || action_check [GOTO_CHECK_OFFSET + yyn] != nt) + return goto_default [nt]; - return action_info [GOTO_INFO_OFFSET + yyn]; - } + return action_info [GOTO_INFO_OFFSET + yyn]; + } - static inline int t_action (int state, int token) - { - const int yyn = action_index [state] + token; + static inline int t_action (int state, int token) + { + const int yyn = action_index [state] + token; - if (yyn < 0 || action_check [yyn] != token) - return - action_default [state]; + if (yyn < 0 || action_check [yyn] != token) + return - action_default [state]; - return action_info [yyn]; - } + return action_info [yyn]; + } }; From e68418f22ed9d0e2e9fbec99a4e500f34e30fba8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 17 Jan 2018 13:42:03 +0100 Subject: [PATCH 02/43] qbs build: Set minimum macOS deployment target unconditionally The previous construct left the value undefined for Qt < 5.7. Task-number: QTCREATORBUG-19602 Change-Id: I6e6e5b0d3fb4ec76593c50bb13bad49f83b50dcc Reviewed-by: Joerg Bornemann Reviewed-by: Alexandru Croitor Reviewed-by: Jake Petroules --- qbs/imports/QtcProduct.qbs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/qbs/imports/QtcProduct.qbs b/qbs/imports/QtcProduct.qbs index c6b130effe4..4e3c8b0d495 100644 --- a/qbs/imports/QtcProduct.qbs +++ b/qbs/imports/QtcProduct.qbs @@ -21,10 +21,10 @@ Product { Depends { name: "qtc" } Depends { name: product.name + " dev headers"; required: false } - Properties { - condition: Utilities.versionCompare(Qt.core.version, "5.7") < 0 - cpp.minimumMacosVersion: project.minimumMacosVersion - } + // TODO: Should fall back to what came from Qt.core for Qt < 5.7, but we cannot express that + // atm. Conditionally pulling in a module that sets the property is also not possible, + // because conflicting scalar values would be reported (QBS-1225 would fix that). + cpp.minimumMacosVersion: project.minimumMacosVersion Properties { condition: qbs.toolchain.contains("gcc") && !qbs.toolchain.contains("clang") From c278c26cb6c9f8c9382e8aa89002116612d87443 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 17 Jan 2018 15:19:17 +0100 Subject: [PATCH 03/43] qbs build: Fix libclang Probe for qbs > 1.10 Probe configure scripts no longer have direct access to module instances. Change-Id: I87c5a7dbd44633cda5740d185829cecdc2d128e6 Reviewed-by: Nikolai Kosjar --- qbs/modules/libclang/functions.js | 6 +++--- qbs/modules/libclang/libclang.qbs | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/qbs/modules/libclang/functions.js b/qbs/modules/libclang/functions.js index fe61da62dd1..a786e23d656 100644 --- a/qbs/modules/libclang/functions.js +++ b/qbs/modules/libclang/functions.js @@ -29,7 +29,7 @@ function isSuitableLLVMConfig(llvmConfigCandidate, qtcFunctions) return false; } -function llvmConfig(qbs, qtcFunctions) +function llvmConfig(hostOS, qtcFunctions) { var llvmInstallDirFromEnv = Environment.getEnv("LLVM_INSTALL_DIR") var llvmConfigVariants = [ @@ -37,7 +37,7 @@ function llvmConfig(qbs, qtcFunctions) ]; // Prefer llvm-config* from LLVM_INSTALL_DIR - var suffix = qbs.hostOS.contains("windows") ? ".exe" : ""; + var suffix = hostOS.contains("windows") ? ".exe" : ""; if (llvmInstallDirFromEnv) { for (var i = 0; i < llvmConfigVariants.length; ++i) { var variant = llvmInstallDirFromEnv + "/bin/" + llvmConfigVariants[i] + suffix; @@ -48,7 +48,7 @@ function llvmConfig(qbs, qtcFunctions) // Find llvm-config* in PATH var pathListString = Environment.getEnv("PATH"); - var separator = qbs.hostOS.contains("windows") ? ";" : ":"; + var separator = hostOS.contains("windows") ? ";" : ":"; var pathList = pathListString.split(separator); for (var i = 0; i < llvmConfigVariants.length; ++i) { for (var j = 0; j < pathList.length; ++j) { diff --git a/qbs/modules/libclang/libclang.qbs b/qbs/modules/libclang/libclang.qbs index 402e4922176..8adf39a220a 100644 --- a/qbs/modules/libclang/libclang.qbs +++ b/qbs/modules/libclang/libclang.qbs @@ -9,6 +9,9 @@ Module { Probe { id: clangProbe + property stringList hostOS: qbs.hostOS + property stringList targetOS: qbs.targetOS + property string llvmConfig property string llvmVersion property string llvmIncludeDir @@ -21,12 +24,12 @@ Module { property string llvmBuildMode configure: { - llvmConfig = ClangFunctions.llvmConfig(qbs, QtcFunctions); + llvmConfig = ClangFunctions.llvmConfig(hostOS, QtcFunctions); llvmVersion = ClangFunctions.version(llvmConfig); llvmIncludeDir = ClangFunctions.includeDir(llvmConfig); llvmLibDir = ClangFunctions.libDir(llvmConfig); - llvmLibs = ClangFunctions.libraries(qbs.targetOS); - llvmToolingLibs = ClangFunctions.toolingLibs(llvmConfig, qbs.targetOS); + llvmLibs = ClangFunctions.libraries(targetOS); + llvmToolingLibs = ClangFunctions.toolingLibs(llvmConfig, targetOS); llvmBuildMode = ClangFunctions.buildMode(llvmConfig); var toolingParams = ClangFunctions.toolingParameters(llvmConfig); llvmToolingDefines = toolingParams.defines; From bf37524ddd30d8ccf37294ea65cf0def7d305716 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 17 Jan 2018 16:14:23 +0100 Subject: [PATCH 04/43] Unify German translation of "text editor" Change-Id: Ib9b62922c949084d4f5e7a92675bcb7530c92c5c Reviewed-by: Friedemann Kleint Reviewed-by: Christian Stenger --- share/qtcreator/translations/qtcreator_de.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_de.ts b/share/qtcreator/translations/qtcreator_de.ts index 56727a69ec7..3ff19d57aef 100644 --- a/share/qtcreator/translations/qtcreator_de.ts +++ b/share/qtcreator/translations/qtcreator_de.ts @@ -10840,7 +10840,7 @@ Dies ist unabhängig vom Wert der Eigenschaft "visible" in QML.TextEditor Text Editor - Text Editor + Texteditor @@ -43079,7 +43079,7 @@ Bitte aktualisieren Sie Ihr Kit oder wählen Sie eine mkspec für qmake, die bes Text Editor - Text Editor + Texteditor From 2d7f1d6c8cf5c9be01d12bd71dbf05da6ce7c3d6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 5 Jan 2018 09:35:00 +0100 Subject: [PATCH 05/43] Clang: Take over jobs if document's project changes On registerProjectPartsForEditor() we recreated the affected DocumentProcessors, but did not take care of the jobs that were in the queue, which effectively could led to lost jobs. Catch up on this. Task-number: QTCREATORBUG-18856 Change-Id: I4184e5dc6480667953f2d2081ccf39a28c092186 Reviewed-by: Ivan Donchevskii --- .../source/clangcodemodelserver.cpp | 16 +++++---- .../clangbackend/source/clangdocument.cpp | 6 ++++ src/tools/clangbackend/source/clangdocument.h | 1 + .../source/clangdocumentprocessor.cpp | 6 ++++ .../source/clangdocumentprocessor.h | 1 + .../source/clangdocumentprocessors.cpp | 21 +++++++++++ .../source/clangdocumentprocessors.h | 1 + .../clangbackend/source/clangjobrequest.cpp | 36 +++++++++++++++++++ .../clangbackend/source/clangjobrequest.h | 1 + src/tools/clangbackend/source/clangjobs.cpp | 19 ++++++++++ src/tools/clangbackend/source/clangjobs.h | 2 ++ ...ngsupportivetranslationunitinitializer.cpp | 31 +++++++++------- ...langsupportivetranslationunitinitializer.h | 3 +- .../unittest/clangcodemodelserver-test.cpp | 12 +++++++ .../unittest/clangdocumentprocessors-test.cpp | 13 +++++++ ...portivetranslationunitinitializer-test.cpp | 12 +++++++ 16 files changed, 162 insertions(+), 19 deletions(-) diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index d3e873d7323..7e004e17d03 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -28,7 +28,6 @@ #include "clangdocuments.h" #include "clangdocumentsuspenderresumer.h" #include "clangfilesystemwatcher.h" -#include "clangtranslationunits.h" #include "codecompleter.h" #include "diagnosticset.h" #include "tokeninfos.h" @@ -158,12 +157,17 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa std::vector affectedDocuments = documents.setDocumentsDirtyIfProjectPartChanged(); for (Document &document : affectedDocuments) { - document.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); + documents.remove({document.fileContainer()}); - documentProcessors().remove(document); - document.translationUnits().removeAll(); - document.translationUnits().createAndAppend(); - documentProcessors().create(document); + Document newDocument = *documents.create({document.fileContainer()}).begin(); + newDocument.setDirtyIfDependencyIsMet(document.filePath()); + newDocument.setIsUsedByCurrentEditor(document.isUsedByCurrentEditor()); + newDocument.setIsVisibleInEditor(document.isVisibleInEditor(), document.visibleTimePoint()); + newDocument.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); + + documentProcessors().reset(document, newDocument); + + QTC_CHECK(document.useCount() == 1); } processJobsForDirtyAndVisibleDocuments(); diff --git a/src/tools/clangbackend/source/clangdocument.cpp b/src/tools/clangbackend/source/clangdocument.cpp index cbbaf51b332..bef88e9cb28 100644 --- a/src/tools/clangbackend/source/clangdocument.cpp +++ b/src/tools/clangbackend/source/clangdocument.cpp @@ -155,6 +155,11 @@ bool Document::isParsed() const return d->translationUnits.areAllTranslationUnitsParsed(); } +long Document::useCount() const +{ + return d.use_count(); +} + Utf8String Document::filePath() const { checkIfNull(); @@ -175,6 +180,7 @@ FileContainer Document::fileContainer() const return FileContainer(d->filePath, d->projectPart.id(), + d->fileArguments, Utf8String(), false, d->documentRevision); diff --git a/src/tools/clangbackend/source/clangdocument.h b/src/tools/clangbackend/source/clangdocument.h index 415deefbe9d..92a852c820a 100644 --- a/src/tools/clangbackend/source/clangdocument.h +++ b/src/tools/clangbackend/source/clangdocument.h @@ -78,6 +78,7 @@ public: bool isNull() const; bool isIntact() const; bool isParsed() const; + long useCount() const; Utf8String filePath() const; Utf8StringVector fileArguments() const; diff --git a/src/tools/clangbackend/source/clangdocumentprocessor.cpp b/src/tools/clangbackend/source/clangdocumentprocessor.cpp index 8196e804d0f..3c51db5b499 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessor.cpp +++ b/src/tools/clangbackend/source/clangdocumentprocessor.cpp @@ -102,6 +102,12 @@ JobRequests DocumentProcessor::process() return d->jobs.process(); } +JobRequests DocumentProcessor::stop() +{ + d->supportiveTranslationUnitInitializer.abort(); + return d->jobs.stop(); +} + Document DocumentProcessor::document() const { return d->document; diff --git a/src/tools/clangbackend/source/clangdocumentprocessor.h b/src/tools/clangbackend/source/clangdocumentprocessor.h index 9c3fb147f94..8f4e8051586 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessor.h +++ b/src/tools/clangbackend/source/clangdocumentprocessor.h @@ -59,6 +59,7 @@ public: = PreferredTranslationUnit::RecentlyParsed); JobRequests process(); + JobRequests stop(); Document document() const; diff --git a/src/tools/clangbackend/source/clangdocumentprocessors.cpp b/src/tools/clangbackend/source/clangdocumentprocessors.cpp index 611611a41f5..ef17dddee0e 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessors.cpp +++ b/src/tools/clangbackend/source/clangdocumentprocessors.cpp @@ -28,6 +28,8 @@ #include "clangexceptions.h" #include "projectpart.h" +#include + namespace ClangBackEnd { DocumentProcessors::DocumentProcessors(Documents &documents, @@ -84,6 +86,25 @@ void DocumentProcessors::remove(const Document &document) throw DocumentProcessorDoesNotExist(document.filePath(), document.projectPart().id()); } +void DocumentProcessors::reset(const Document &oldDocument, const Document &newDocument) +{ + // Wait until the currently running jobs finish and remember the not yet + // processed job requests for the new processor... + JobRequests jobsToTakeOver = processor(oldDocument).stop(); + // ...but do not take over irrelevant ones. + jobsToTakeOver = Utils::filtered(jobsToTakeOver, [](const JobRequest &job){ + return job.isTakeOverable(); + }); + + // Remove current processor + remove(oldDocument); + + // Create new processor and take over not yet processed jobs. + DocumentProcessor newProcessor = create(newDocument); + for (const JobRequest &job : jobsToTakeOver) + newProcessor.addJob(job); +} + JobRequests DocumentProcessors::process() { JobRequests jobsStarted; diff --git a/src/tools/clangbackend/source/clangdocumentprocessors.h b/src/tools/clangbackend/source/clangdocumentprocessors.h index 83e37f52766..4060fd4b47a 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessors.h +++ b/src/tools/clangbackend/source/clangdocumentprocessors.h @@ -54,6 +54,7 @@ public: DocumentProcessor create(const Document &document); DocumentProcessor processor(const Document &document); void remove(const Document &document); + void reset(const Document &oldDocument, const Document &newDocument); JobRequests process(); diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index e2c6f8f6d49..2715ecde1c7 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -168,6 +168,42 @@ static JobRequest::RunConditions conditionsForType(JobRequest::Type type) return conditions; } +bool JobRequest::isTakeOverable() const +{ + // When new project information comes in and there are unprocessed jobs + // in the queue, we need to decide what to do with them. + + switch (type) { + // Never discard these as the client side might wait for a response. + case Type::CompleteCode: + case Type::RequestReferences: + case Type::FollowSymbol: + return true; + + // Discard this one as UpdateDocumentAnnotations will have the same effect. + case Type::RequestDocumentAnnotations: + + // Discard Suspend because the document will be cleared anyway. + // Discard Resume because a (re)parse will happen on demand. + case Type::SuspendDocument: + case Type::ResumeDocument: + + // Discard these as they are initial jobs that will be recreated on demand + // anyway. + case Type::UpdateDocumentAnnotations: + case Type::CreateInitialDocumentPreamble: + + // Discard these as they only make sense in a row. Avoid splitting them up. + case Type::ParseSupportiveTranslationUnit: + case Type::ReparseSupportiveTranslationUnit: + + case Type::Invalid: + return false; + } + + return false; +} + JobRequest::JobRequest(Type type) { static quint64 idCounter = 0; diff --git a/src/tools/clangbackend/source/clangjobrequest.h b/src/tools/clangbackend/source/clangjobrequest.h index 81c78ba9dbc..04474967537 100644 --- a/src/tools/clangbackend/source/clangjobrequest.h +++ b/src/tools/clangbackend/source/clangjobrequest.h @@ -96,6 +96,7 @@ public: IAsyncJob *createJob() const; void cancelJob(ClangCodeModelClientInterface &client) const; + bool isTakeOverable() const; bool operator==(const JobRequest &other) const; diff --git a/src/tools/clangbackend/source/clangjobs.cpp b/src/tools/clangbackend/source/clangjobs.cpp index 872aecd936b..61f99b39852 100644 --- a/src/tools/clangbackend/source/clangjobs.cpp +++ b/src/tools/clangbackend/source/clangjobs.cpp @@ -113,6 +113,20 @@ JobRequests Jobs::process() return jobsStarted; } +JobRequests Jobs::stop() +{ + // Take the queued jobs to prevent processing them. + const JobRequests queuedJobs = queue(); + queue().clear(); + + // Wait until currently running jobs finish. + QFutureSynchronizer waitForFinishedJobs; + foreach (const RunningJob &runningJob, m_running.values()) + waitForFinishedJobs.addFuture(runningJob.future); + + return queuedJobs; +} + JobRequests Jobs::runJobs(const JobRequests &jobsRequests) { JobRequests jobsStarted; @@ -166,6 +180,11 @@ void Jobs::onJobFinished(IAsyncJob *asyncJob) process(); } +Jobs::JobFinishedCallback Jobs::jobFinishedCallback() const +{ + return m_jobFinishedCallback; +} + void Jobs::setJobFinishedCallback(const JobFinishedCallback &jobFinishedCallback) { m_jobFinishedCallback = jobFinishedCallback; diff --git a/src/tools/clangbackend/source/clangjobs.h b/src/tools/clangbackend/source/clangjobs.h index c2984db4b44..dd6b5d50810 100644 --- a/src/tools/clangbackend/source/clangjobs.h +++ b/src/tools/clangbackend/source/clangjobs.h @@ -71,6 +71,7 @@ public: = PreferredTranslationUnit::RecentlyParsed); JobRequests process(); + JobRequests stop(); void setJobFinishedCallback(const JobFinishedCallback &jobFinishedCallback); @@ -80,6 +81,7 @@ public /*for tests*/: const JobRequests &queue() const; bool isJobRunningForTranslationUnit(const Utf8String &translationUnitId) const; bool isJobRunningForJobRequest(const JobRequest &jobRequest) const; + JobFinishedCallback jobFinishedCallback() const; private: JobRequests runJobs(const JobRequests &jobRequest); diff --git a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp index 9c162eb8cfa..b84fe431553 100644 --- a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp +++ b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.cpp @@ -56,8 +56,7 @@ SupportiveTranslationUnitInitializer::State SupportiveTranslationUnitInitializer void SupportiveTranslationUnitInitializer::startInitializing() { - QTC_CHECK(m_state == State::NotInitialized); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::NotInitialized)) return; m_document.translationUnits().createAndAppend(); @@ -71,10 +70,15 @@ void SupportiveTranslationUnitInitializer::startInitializing() m_state = State::WaitingForParseJob; } +void SupportiveTranslationUnitInitializer::abort() +{ + m_jobs.setJobFinishedCallback(Jobs::JobFinishedCallback()); + m_state = State::Aborted; +} + void SupportiveTranslationUnitInitializer::checkIfParseJobFinished(const Jobs::RunningJob &job) { - QTC_CHECK(m_state == State::WaitingForParseJob); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::WaitingForParseJob)) return; if (job.jobRequest.type == JobRequest::Type::ParseSupportiveTranslationUnit) { @@ -90,8 +94,7 @@ void SupportiveTranslationUnitInitializer::checkIfParseJobFinished(const Jobs::R void SupportiveTranslationUnitInitializer::checkIfReparseJobFinished(const Jobs::RunningJob &job) { - QTC_CHECK(m_state == State::WaitingForReparseJob); - if (abortIfDocumentIsClosed()) + if (!checkStateAndDocument(State::WaitingForReparseJob)) return; if (job.jobRequest.type == JobRequest::Type::ReparseSupportiveTranslationUnit) { @@ -106,16 +109,20 @@ void SupportiveTranslationUnitInitializer::checkIfReparseJobFinished(const Jobs: } } -bool SupportiveTranslationUnitInitializer::abortIfDocumentIsClosed() +bool SupportiveTranslationUnitInitializer::checkStateAndDocument(State currentExpectedState) { - QTC_CHECK(m_isDocumentClosedChecker); - - if (m_isDocumentClosedChecker(m_document.filePath(), m_document.projectPart().id())) { + if (m_state != currentExpectedState) { m_state = State::Aborted; - return true; + return false; } - return false; + QTC_CHECK(m_isDocumentClosedChecker); + if (m_isDocumentClosedChecker(m_document.filePath(), m_document.projectPart().id())) { + m_state = State::Aborted; + return false; + } + + return true; } void SupportiveTranslationUnitInitializer::addJob(JobRequest::Type jobRequestType) diff --git a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h index 18a01864ddc..785e145c60f 100644 --- a/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h +++ b/src/tools/clangbackend/source/clangsupportivetranslationunitinitializer.h @@ -52,6 +52,7 @@ public: State state() const; void startInitializing(); + void abort(); public: // for tests void setState(const State &state); @@ -59,7 +60,7 @@ public: // for tests void checkIfReparseJobFinished(const Jobs::RunningJob &job); private: - bool abortIfDocumentIsClosed(); + bool checkStateAndDocument(State currentExpectedState); void addJob(JobRequest::Type jobRequestType); private: diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index 36efb1597a8..edcbcff7ade 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -406,6 +406,18 @@ TEST_F(ClangCodeModelServerSlowTest, TranslationUnitAfterUpdateNeedsReparse) ASSERT_THAT(clangServer, HasDirtyDocument(filePathA, projectPartId, 1U, true, true)); } +TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartChange) +{ + registerProjectAndFileAndWaitForFinished(filePathC, 2); + updateVisibilty(filePathB, filePathB); // Disable processing jobs + requestReferences(); + + expectReferences(); + + changeProjectPartArguments(); // Here we do not want to loose the RequestReferences job + updateVisibilty(filePathC, filePathC); // Enable processing jobs +} + void ClangCodeModelServer::SetUp() { clangServer.setClient(&mockClangCodeModelClient); diff --git a/tests/unit/unittest/clangdocumentprocessors-test.cpp b/tests/unit/unittest/clangdocumentprocessors-test.cpp index 87990bca114..0e16ab1f4e0 100644 --- a/tests/unit/unittest/clangdocumentprocessors-test.cpp +++ b/tests/unit/unittest/clangdocumentprocessors-test.cpp @@ -126,6 +126,19 @@ TEST_F(DocumentProcessors, Remove) ASSERT_TRUE(documentProcessors.processors().empty()); } +TEST_F(DocumentProcessors, ResetTakesOverJobsInQueue) +{ + documentProcessors.create(document); + documentProcessors.processor(document).addJob(JobRequest::Type::RequestReferences); + documents.remove({document.fileContainer()}); + const auto newDocument = *documents.create({document.fileContainer()}).begin(); + + documentProcessors.reset(document, newDocument); + + ASSERT_THAT(documentProcessors.processor(document).queue().first().type, + JobRequest::Type::RequestReferences); +} + TEST_F(DocumentProcessors, RemoveThrowsForNotExisting) { ASSERT_THROW(documentProcessors.remove(document), diff --git a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp index 540fcf7fdc7..65062a9d165 100644 --- a/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp +++ b/tests/unit/unittest/clangsupportivetranslationunitinitializer-test.cpp @@ -111,6 +111,18 @@ TEST_F(SupportiveTranslationUnitInitializerSlowTest, StartInitializingStartsJob) ASSERT_THAT(runningJob.jobRequest.type, JobRequest::Type::ParseSupportiveTranslationUnit); } +TEST_F(SupportiveTranslationUnitInitializerSlowTest, Abort) +{ + initializer.startInitializing(); + assertSingleJobRunningAndEmptyQueue(); + + initializer.abort(); + + ASSERT_THAT(initializer.state(), + Eq(ClangBackEnd::SupportiveTranslationUnitInitializer::State::Aborted)); + ASSERT_FALSE(jobs.jobFinishedCallback()); +} + TEST_F(SupportiveTranslationUnitInitializer, CheckIfParseJobFinishedAbortsIfDocumentIsClosed) { documents.remove({FileContainer(filePath, projectPartId)}); From 0a4073ef90cb61400856ead7c137064096694b6a Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 10:47:45 +0100 Subject: [PATCH 06/43] TextEditor: Return hover handler priority by callback ...to get rid of the asynchronous code path. Change-Id: I56377510440631b0be712333b2a4018717c86389 Reviewed-by: David Schulz --- .../clangcodemodel/clanghoverhandler.cpp | 11 ++++--- .../clangcodemodel/clanghoverhandler.h | 8 ++--- .../clangqueryhoverhandler.cpp | 7 ++++- .../clangrefactoring/clangqueryhoverhandler.h | 4 ++- .../cppeditor/resourcepreviewhoverhandler.cpp | 7 ++++- .../cppeditor/resourcepreviewhoverhandler.h | 4 ++- src/plugins/cpptools/cpphoverhandler.cpp | 5 +++- src/plugins/cpptools/cpphoverhandler.h | 4 ++- .../profilehoverhandler.cpp | 7 ++++- .../qmakeprojectmanager/profilehoverhandler.h | 4 ++- src/plugins/qmljseditor/qmljshoverhandler.cpp | 5 +++- src/plugins/qmljseditor/qmljshoverhandler.h | 4 ++- src/plugins/texteditor/basehoverhandler.cpp | 30 +++---------------- src/plugins/texteditor/basehoverhandler.h | 14 ++++----- .../texteditor/colorpreviewhoverhandler.cpp | 7 ++++- .../texteditor/colorpreviewhoverhandler.h | 2 +- src/plugins/texteditor/texteditor.cpp | 6 ++-- 17 files changed, 69 insertions(+), 60 deletions(-) diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp index 6610b555c22..2281b5d304e 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.cpp +++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp @@ -102,17 +102,16 @@ static QFuture editorDocumentHandlesToolTipInfo( ClangHoverHandler::ClangHoverHandler() { - setIsAsyncHandler(true); } ClangHoverHandler::~ClangHoverHandler() { - cancelAsyncCheck(); + abort(); } -void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, - int pos, - BaseHoverHandler::ReportPriority report) +void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + BaseHoverHandler::ReportPriority report) { // Reset m_futureWatcher.reset(); @@ -143,7 +142,7 @@ void ClangHoverHandler::identifyMatchAsync(TextEditorWidget *editorWidget, report(Priority_None); // Ops, something went wrong. } -void ClangHoverHandler::cancelAsyncCheck() +void ClangHoverHandler::abort() { if (m_futureWatcher) m_futureWatcher->cancel(); diff --git a/src/plugins/clangcodemodel/clanghoverhandler.h b/src/plugins/clangcodemodel/clanghoverhandler.h index 85b7999f94b..e6e262ecd01 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.h +++ b/src/plugins/clangcodemodel/clanghoverhandler.h @@ -40,14 +40,14 @@ public: ClangHoverHandler(); ~ClangHoverHandler() override; - void identifyMatchAsync(TextEditor::TextEditorWidget *editorWidget, - int pos, - ReportPriority report) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: - void cancelAsyncCheck() override; + void abort() override; void processToolTipInfo(const CppTools::ToolTipInfo &info); private: diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp index e8ce90c297c..11a29f1db1f 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.cpp @@ -30,6 +30,7 @@ #include #include +#include namespace ClangRefactoring { @@ -38,8 +39,12 @@ ClangQueryHoverHandler::ClangQueryHoverHandler(ClangQueryHighlighter *highligher { } -void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) +void ClangQueryHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + using Messages = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainers; using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers; diff --git a/src/plugins/clangrefactoring/clangqueryhoverhandler.h b/src/plugins/clangrefactoring/clangqueryhoverhandler.h index 7a93bcbf5d3..a9dfc5fe229 100644 --- a/src/plugins/clangrefactoring/clangqueryhoverhandler.h +++ b/src/plugins/clangrefactoring/clangqueryhoverhandler.h @@ -37,7 +37,9 @@ public: ClangQueryHoverHandler(ClangQueryHighlighter *highligher); protected: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int position) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int position, + ReportPriority report) override; private: ClangQueryHighlighter *m_highligher; diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp index 47c691760d1..a657fcd6bc3 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -164,8 +165,12 @@ static QString findResourceInProject(const QString &resName) return QString(); } -void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ResourcePreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/cppeditor/resourcepreviewhoverhandler.h b/src/plugins/cppeditor/resourcepreviewhoverhandler.h index 2ccb261c2a8..b0977099ecb 100644 --- a/src/plugins/cppeditor/resourcepreviewhoverhandler.h +++ b/src/plugins/cppeditor/resourcepreviewhoverhandler.h @@ -35,7 +35,9 @@ namespace Internal { class ResourcePreviewHoverHandler : public TextEditor::BaseHoverHandler { private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; private: diff --git a/src/plugins/cpptools/cpphoverhandler.cpp b/src/plugins/cpptools/cpphoverhandler.cpp index 1ff41b7fdc3..3969065ff70 100644 --- a/src/plugins/cpptools/cpphoverhandler.cpp +++ b/src/plugins/cpptools/cpphoverhandler.cpp @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -67,8 +68,10 @@ QString CppHoverHandler::tooltipTextForHelpItem(const HelpItem &helpItem) return QString(); } -void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void CppHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + QTextCursor tc(editorWidget->document()); tc.setPosition(pos); diff --git a/src/plugins/cpptools/cpphoverhandler.h b/src/plugins/cpptools/cpphoverhandler.h index edfa6901cf8..75d6475537e 100644 --- a/src/plugins/cpptools/cpphoverhandler.h +++ b/src/plugins/cpptools/cpphoverhandler.h @@ -37,7 +37,9 @@ public: static QString tooltipTextForHelpItem(const TextEditor::HelpItem &help); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void decorateToolTip() override; }; diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp index dfbee9bb665..2aa7fb94b36 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -44,8 +45,12 @@ ProFileHoverHandler::ProFileHoverHandler() { } -void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) +void ProFileHoverHandler::identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + m_docFragment.clear(); m_manualKind = UnknownManual; if (!editorWidget->extraSelectionTooltip(pos).isEmpty()) { diff --git a/src/plugins/qmakeprojectmanager/profilehoverhandler.h b/src/plugins/qmakeprojectmanager/profilehoverhandler.h index cc9f91ef02b..bbcd74db7aa 100644 --- a/src/plugins/qmakeprojectmanager/profilehoverhandler.h +++ b/src/plugins/qmakeprojectmanager/profilehoverhandler.h @@ -40,7 +40,9 @@ public: ProFileHoverHandler(); private: - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void identifyQMakeKeyword(const QString &text, int pos); enum ManualKind { diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp index a767d6713ba..7334ad7ecd1 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.cpp +++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -201,8 +202,10 @@ bool QmlJSHoverHandler::setQmlTypeHelp(const ScopeChain &scopeChain, const Docum return true; } -void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void QmlJSHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + reset(); if (!m_modelManager) diff --git a/src/plugins/qmljseditor/qmljshoverhandler.h b/src/plugins/qmljseditor/qmljshoverhandler.h index fde05c7e4a6..682d713f39d 100644 --- a/src/plugins/qmljseditor/qmljshoverhandler.h +++ b/src/plugins/qmljseditor/qmljshoverhandler.h @@ -58,7 +58,9 @@ public: private: void reset(); - void identifyMatch(TextEditor::TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditor::TextEditorWidget *editorWidget, + int pos, + ReportPriority report) override; void operateTooltip(TextEditor::TextEditorWidget *editorWidget, const QPoint &point) override; bool matchDiagnosticMessage(QmlJSEditorWidget *qmlEditor, int pos); diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 86d8eb0bbcd..10a532bcc11 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -26,6 +26,7 @@ #include "basehoverhandler.h" #include "texteditor.h" +#include #include #include @@ -34,11 +35,6 @@ namespace TextEditor { BaseHoverHandler::~BaseHoverHandler() {} -bool BaseHoverHandler::isAsyncHandler() const -{ - return m_isAsyncHandler; -} - void BaseHoverHandler::showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate) { if (decorate) @@ -55,11 +51,6 @@ void BaseHoverHandler::checkPriority(TextEditorWidget *widget, process(widget, pos, report); } -void BaseHoverHandler::cancelAsyncCheck() -{ - QTC_CHECK(false && "BaseHoverHandler: Implement cancelCheck() in derived class!"); -} - int BaseHoverHandler::priority() const { if (m_priority >= 0) @@ -117,31 +108,18 @@ void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority m_priority = -1; m_lastHelpItemIdentified = HelpItem(); - if (m_isAsyncHandler) { - identifyMatchAsync(widget, pos, report); - } else { - identifyMatch(widget, pos); - report(priority()); - } + identifyMatch(widget, pos, report); } -void BaseHoverHandler::setIsAsyncHandler(bool isAsyncHandler) +void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) { - m_isAsyncHandler = isAsyncHandler; -} + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); -void BaseHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) -{ QString tooltip = editorWidget->extraSelectionTooltip(pos); if (!tooltip.isEmpty()) setToolTip(tooltip); } -void BaseHoverHandler::identifyMatchAsync(TextEditorWidget *, int, BaseHoverHandler::ReportPriority) -{ - QTC_CHECK(false && "BaseHoverHandler: Implement identifyMatchAsync() in derived class!"); -} - void BaseHoverHandler::decorateToolTip() { if (Qt::mightBeRichText(toolTip())) diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index cdd8735264b..4c3638c4e49 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -43,14 +43,11 @@ class TEXTEDITOR_EXPORT BaseHoverHandler public: virtual ~BaseHoverHandler(); - bool isAsyncHandler() const; - void setIsAsyncHandler(bool isAsyncHandler); - QString contextHelpId(TextEditorWidget *widget, int pos); using ReportPriority = std::function; void checkPriority(TextEditorWidget *widget, int pos, ReportPriority report); - virtual void cancelAsyncCheck(); + virtual void abort() {} // Implement for asynchronous priority reporter void showToolTip(TextEditorWidget *widget, const QPoint &point, bool decorate = true); @@ -70,16 +67,17 @@ protected: void setLastHelpItemIdentified(const HelpItem &help); const HelpItem &lastHelpItemIdentified() const; - virtual void identifyMatch(TextEditorWidget *editorWidget, int pos); - virtual void identifyMatchAsync(TextEditorWidget *editorWidget, int pos, ReportPriority report); + // identifyMatch() is required to report a priority by using the "report" callback. + // It is recommended to use e.g. + // Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + // at the beginning of an implementation to ensure this in any case. + virtual void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report); virtual void decorateToolTip(); virtual void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point); private: void process(TextEditorWidget *widget, int pos, ReportPriority report); - bool m_isAsyncHandler = false; - QString m_toolTip; HelpItem m_lastHelpItemIdentified; int m_priority = -1; diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.cpp b/src/plugins/texteditor/colorpreviewhoverhandler.cpp index c6ca5947d00..6a6f4e20dd9 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.cpp +++ b/src/plugins/texteditor/colorpreviewhoverhandler.cpp @@ -27,6 +27,7 @@ #include "texteditor.h" #include +#include #include #include @@ -355,8 +356,12 @@ static QColor colorFromFuncAndArgs(const QString &func, const QStringList &args) return colorFromArgs(args, spec); } -void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, int pos) +void ColorPreviewHoverHandler::identifyMatch(TextEditorWidget *editorWidget, + int pos, + ReportPriority report) { + Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); + if (editorWidget->extraSelectionTooltip(pos).isEmpty()) { const QTextBlock tb = editorWidget->document()->findBlock(pos); const int tbpos = pos - tb.position(); diff --git a/src/plugins/texteditor/colorpreviewhoverhandler.h b/src/plugins/texteditor/colorpreviewhoverhandler.h index 8677bf009a2..ee8db3f93f4 100644 --- a/src/plugins/texteditor/colorpreviewhoverhandler.h +++ b/src/plugins/texteditor/colorpreviewhoverhandler.h @@ -39,7 +39,7 @@ class TextEditorWidget; class TEXTEDITOR_EXPORT ColorPreviewHoverHandler : public BaseHoverHandler { private: - void identifyMatch(TextEditorWidget *editorWidget, int pos) override; + void identifyMatch(TextEditorWidget *editorWidget, int pos, ReportPriority report) override; void operateTooltip(TextEditorWidget *editorWidget, const QPoint &point) override; QColor m_colorTip; diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 505c4325aec..ee7e0a9861e 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -314,10 +314,8 @@ public: } // Cancel currently running checks - for (BaseHoverHandler *handler : m_handlers) { - if (handler->isAsyncHandler()) - handler->cancelAsyncCheck(); - } + for (BaseHoverHandler *handler : m_handlers) + handler->abort(); // Update invocation data m_documentRevision = documentRevision; From 9fd9bd25ab5c54fd9ce23a85cb48c54a836867d8 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 11:58:22 +0100 Subject: [PATCH 07/43] TextEditor: Let BaseHoverHandler handle help id callbacks ...to support asynchronous hover handlers like ClangHoverHandler. Change-Id: I8dc7189db37ec3a923cf493b8957c59ec9be447c Reviewed-by: David Schulz --- src/plugins/texteditor/basehoverhandler.cpp | 23 +++++++++++++++------ src/plugins/texteditor/basehoverhandler.h | 8 ++++++- src/plugins/texteditor/texteditor.cpp | 5 +++-- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/plugins/texteditor/basehoverhandler.cpp b/src/plugins/texteditor/basehoverhandler.cpp index 10a532bcc11..3b5edef2ee4 100644 --- a/src/plugins/texteditor/basehoverhandler.cpp +++ b/src/plugins/texteditor/basehoverhandler.cpp @@ -70,16 +70,16 @@ void BaseHoverHandler::setPriority(int priority) m_priority = priority; } -QString BaseHoverHandler::contextHelpId(TextEditorWidget *widget, int pos) +void BaseHoverHandler::contextHelpId(TextEditorWidget *widget, + int pos, + const Core::IContext::HelpIdCallback &callback) { // If the tooltip is visible and there is a help match, this match is used to update // the help id. Otherwise, let the identification process happen. if (!Utils::ToolTip::isVisible() || !lastHelpItemIdentified().isValid()) - process(widget, pos, [](int){}); - - if (lastHelpItemIdentified().isValid()) - return lastHelpItemIdentified().helpId(); - return QString(); + process(widget, pos, [this, widget, callback](int) { propagateHelpId(widget, callback); }); + else + propagateHelpId(widget, callback); } void BaseHoverHandler::setToolTip(const QString &tooltip) @@ -102,6 +102,17 @@ const HelpItem &BaseHoverHandler::lastHelpItemIdentified() const return m_lastHelpItemIdentified; } +void BaseHoverHandler::propagateHelpId(TextEditorWidget *widget, + const Core::IContext::HelpIdCallback &callback) +{ + QString id; + if (lastHelpItemIdentified().isValid()) + id = lastHelpItemIdentified().helpId(); + + widget->setContextHelpId(id); + callback(id); +} + void BaseHoverHandler::process(TextEditorWidget *widget, int pos, ReportPriority report) { m_toolTip.clear(); diff --git a/src/plugins/texteditor/basehoverhandler.h b/src/plugins/texteditor/basehoverhandler.h index 4c3638c4e49..bc8d3e3e1d5 100644 --- a/src/plugins/texteditor/basehoverhandler.h +++ b/src/plugins/texteditor/basehoverhandler.h @@ -28,6 +28,8 @@ #include "texteditor_global.h" #include "helpitem.h" +#include + #include QT_BEGIN_NAMESPACE @@ -43,7 +45,9 @@ class TEXTEDITOR_EXPORT BaseHoverHandler public: virtual ~BaseHoverHandler(); - QString contextHelpId(TextEditorWidget *widget, int pos); + void contextHelpId(TextEditorWidget *widget, + int pos, + const Core::IContext::HelpIdCallback &callback); using ReportPriority = std::function; void checkPriority(TextEditorWidget *widget, int pos, ReportPriority report); @@ -67,6 +71,8 @@ protected: void setLastHelpItemIdentified(const HelpItem &help); const HelpItem &lastHelpItemIdentified() const; + void propagateHelpId(TextEditorWidget *widget, const Core::IContext::HelpIdCallback &callback); + // identifyMatch() is required to report a priority by using the "report" callback. // It is recommended to use e.g. // Utils::ExecuteOnDestruction reportPriority([this, report](){ report(priority()); }); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index ee7e0a9861e..2e5aa9dd5f6 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -7925,8 +7925,9 @@ void BaseTextEditor::setContextHelpId(const QString &id) void TextEditorWidget::contextHelpId(const IContext::HelpIdCallback &callback) { if (d->m_contextHelpId.isEmpty() && !d->m_hoverHandlers.isEmpty()) - d->m_contextHelpId = d->m_hoverHandlers.first()->contextHelpId(this, textCursor().position()); - callback(d->m_contextHelpId); + d->m_hoverHandlers.first()->contextHelpId(this, textCursor().position(), callback); + else + callback(d->m_contextHelpId); } void TextEditorWidget::setContextHelpId(const QString &id) From 97c2bcf8d2b9f49385a01370aef3e8836e4b76a4 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 15:07:46 +0100 Subject: [PATCH 08/43] Clang: Fix comment Change-Id: Ib69d0696ed7cc810990e61c62a1af236f54f09ca Reviewed-by: Ivan Donchevskii --- src/tools/clangbackend/source/clangbackend_global.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/clangbackend/source/clangbackend_global.h b/src/tools/clangbackend/source/clangbackend_global.h index a7ca7859587..31425c07173 100644 --- a/src/tools/clangbackend/source/clangbackend_global.h +++ b/src/tools/clangbackend/source/clangbackend_global.h @@ -36,7 +36,7 @@ enum class PreferredTranslationUnit LastUninitialized, }; -// CLANG-UPGRADE-CHECK: Remove IS_SUSPEND_SUPPORTED once we require clang >= 7.0 +// CLANG-UPGRADE-CHECK: Remove IS_PRETTY_DECL_SUPPORTED once we require clang >= 7.0 #if defined(CINDEX_VERSION_HAS_PRETTYDECL_BACKPORTED) || CINDEX_VERSION_MINOR >= 47 # define IS_PRETTY_DECL_SUPPORTED #endif From 56157f739d8547c0abf1500ef3a696531f3e9338 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 12:16:43 +0100 Subject: [PATCH 09/43] Clang: Cancel tooltip future on backend restart Change-Id: Icbc461aa765c47ae0dd708a731b4d132bfa0f7d8 Reviewed-by: Ivan Donchevskii --- src/plugins/clangcodemodel/clangbackendreceiver.cpp | 7 ++++++- src/plugins/clangcodemodel/clanghoverhandler.cpp | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp index f2606d74cc5..3794eb0b6ba 100644 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ b/src/plugins/clangcodemodel/clangbackendreceiver.cpp @@ -151,7 +151,7 @@ void BackendReceiver::reset() qDeleteAll(m_assistProcessorsTable.begin(), m_assistProcessorsTable.end()); m_assistProcessorsTable.clear(); - // Clean up futures for references + // Clean up futures for references; TODO: Remove duplication for (ReferencesEntry &entry : m_referencesTable) { entry.futureInterface.cancel(); entry.futureInterface.reportFinished(); @@ -162,6 +162,11 @@ void BackendReceiver::reset() futureInterface.reportFinished(); } m_followTable.clear(); + for (QFutureInterface &futureInterface : m_toolTipsTable) { + futureInterface.cancel(); + futureInterface.reportFinished(); + } + m_toolTipsTable.clear(); } void BackendReceiver::alive() diff --git a/src/plugins/clangcodemodel/clanghoverhandler.cpp b/src/plugins/clangcodemodel/clanghoverhandler.cpp index 2281b5d304e..5903b182467 100644 --- a/src/plugins/clangcodemodel/clanghoverhandler.cpp +++ b/src/plugins/clangcodemodel/clanghoverhandler.cpp @@ -144,8 +144,10 @@ void ClangHoverHandler::identifyMatch(TextEditorWidget *editorWidget, void ClangHoverHandler::abort() { - if (m_futureWatcher) + if (m_futureWatcher) { m_futureWatcher->cancel(); + m_futureWatcher.reset(); + } } #define RETURN_TEXT_FOR_CASE(enumValue) case TextEditor::HelpItem::enumValue: return #enumValue From 51ddd4bcfda39ac7acc2dabfd78494b8cdf839e8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 19 Jan 2018 13:23:47 +0100 Subject: [PATCH 10/43] qbs build: Suppress some warnings Like in the qmake build. Change-Id: I7dc4a42bf3e4394a4fb6a579646d806f80fa3e96 Reviewed-by: David Schulz --- qbs/imports/QtcProduct.qbs | 4 ++++ qbs/modules/qtc/qtc.qbs | 1 + 2 files changed, 5 insertions(+) diff --git a/qbs/imports/QtcProduct.qbs b/qbs/imports/QtcProduct.qbs index ef19ce49876..2aebb244f20 100644 --- a/qbs/imports/QtcProduct.qbs +++ b/qbs/imports/QtcProduct.qbs @@ -31,6 +31,10 @@ Product { condition: qbs.toolchain.contains("gcc") && !qbs.toolchain.contains("clang") cpp.cxxFlags: base.concat(["-Wno-noexcept-type"]) } + Properties { + condition: qbs.toolchain.contains("msvc") + cpp.cxxFlags: base.concat(["/w44996"]) + } cpp.cxxLanguageVersion: "c++14" cpp.defines: qtc.generalDefines cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2" diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index a710ad05ab1..9a669ccfc0f 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -85,6 +85,7 @@ Module { "QT_USE_FAST_OPERATOR_PLUS", "QT_USE_FAST_CONCATENATION", ].concat(testsEnabled ? ["WITH_TESTS"] : []) + .concat(qbs.toolchain.contains("msvc") ? ["_CRT_SECURE_NO_WARNINGS"] : []) Rule { condition: make_dev_package From a405f2f53d3f9691dc3c1cdd8e98d1515f20939a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 19 Jan 2018 11:51:15 +0100 Subject: [PATCH 11/43] qbs build: Fix minimum Windows version It's Windows 7, not XP. Change-Id: I0f058fae0e4af10ddca20967eb51594099ba8569 Reviewed-by: Christian Stenger Reviewed-by: David Schulz --- qbs/imports/QtcProduct.qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qbs/imports/QtcProduct.qbs b/qbs/imports/QtcProduct.qbs index 2aebb244f20..cd3bee32972 100644 --- a/qbs/imports/QtcProduct.qbs +++ b/qbs/imports/QtcProduct.qbs @@ -37,7 +37,7 @@ Product { } cpp.cxxLanguageVersion: "c++14" cpp.defines: qtc.generalDefines - cpp.minimumWindowsVersion: qbs.architecture === "x86" ? "5.1" : "5.2" + cpp.minimumWindowsVersion: "6.1" cpp.useCxxPrecompiledHeader: useNonGuiPchFile || useGuiPchFile cpp.visibility: "minimal" From fdb95299c67b195d46cd3b7a37ed5118809e9a57 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 19 Jan 2018 10:57:32 +0100 Subject: [PATCH 12/43] Update qbs submodule To HEAD of 1.10 branch. Change-Id: Ia43e86a65cb9eb50712414fe522c851197d2e049 Reviewed-by: Joerg Bornemann --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 3bde712fa2c..d3e137c2024 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 3bde712fa2c1f926720e85d20ae7fd5f9f378fef +Subproject commit d3e137c20248f6852a91341782011ca58534ed21 From 43a3ea1d22ccf1c9cb3109ed4b93960b01ad81ba Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 11:35:55 +0100 Subject: [PATCH 13/43] CppTools: Remove pointless loop Change-Id: Ie6c597421f81529973351a6363c0110435e42c29 Reviewed-by: Ivan Donchevskii --- src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index 44187b6a102..206a0d8baab 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -101,9 +101,7 @@ static void addBuiltinConfigs(ClangDiagnosticConfigsModel &model) ClangDiagnosticConfigsModel::ClangDiagnosticConfigsModel(const ClangDiagnosticConfigs &customConfigs) { addBuiltinConfigs(*this); - - foreach (const ClangDiagnosticConfig &config, customConfigs) - m_diagnosticConfigs.append(config); + m_diagnosticConfigs.append(customConfigs); } int ClangDiagnosticConfigsModel::size() const From 9f4c55528de6c55739cfcdae0016db386f6daf8e Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 11:48:27 +0100 Subject: [PATCH 14/43] CppTools: Remove unused signals/functions Change-Id: I00420f98eb49acfbcbb7f719b0d3a867a8882d31 Reviewed-by: Ivan Donchevskii --- src/plugins/cpptools/cppcodemodelsettings.cpp | 5 ----- src/plugins/cpptools/cppcodemodelsettings.h | 4 ---- 2 files changed, 9 deletions(-) diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index ed860d0c4ab..15ec9c9bfee 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -183,11 +183,6 @@ void CppCodeModelSettings::setPCHUsage(CppCodeModelSettings::PCHUsage pchUsage) m_pchUsage = pchUsage; } -void CppCodeModelSettings::emitChanged() -{ - emit changed(); -} - bool CppCodeModelSettings::interpretAmbigiousHeadersAsCHeaders() const { return m_interpretAmbigiousHeadersAsCHeaders; diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index edf0a6e1dc3..22f5b25c6b2 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -78,12 +78,8 @@ public: QString clazyChecks() const; void setClazyChecks(QString checks); -public: // for tests - void emitChanged(); - signals: void changed(); - void clangDiagnosticConfigIdChanged(); private: PCHUsage m_pchUsage = PchUse_None; From 4875e07efbc2c74d80f1d5aef8e9b8b31927e985 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 14:11:01 +0100 Subject: [PATCH 15/43] Clang: Add 'override' to related destructors Change-Id: I763ec2d3462f9a3d1a1afc4270c5f1015bee758f Reviewed-by: Ivan Donchevskii --- src/plugins/clangcodemodel/clangcompletionassistprocessor.h | 2 +- src/plugins/clangcodemodel/clangeditordocumentprocessor.h | 2 +- src/plugins/clangcodemodel/clangmodelmanagersupport.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h index 0f23b1a0fee..3e20caa37b8 100644 --- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.h +++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.h @@ -46,7 +46,7 @@ class ClangCompletionAssistProcessor : public CppTools::CppCompletionAssistProce public: ClangCompletionAssistProcessor(); - ~ClangCompletionAssistProcessor(); + ~ClangCompletionAssistProcessor() override; TextEditor::IAssistProposal *perform(const TextEditor::AssistInterface *interface) override; diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 67745b582cb..e79525e736d 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -52,7 +52,7 @@ class ClangEditorDocumentProcessor : public CppTools::BaseEditorDocumentProcesso public: ClangEditorDocumentProcessor(BackendCommunicator &communicator, TextEditor::TextDocument *document); - ~ClangEditorDocumentProcessor(); + ~ClangEditorDocumentProcessor() override; // BaseEditorDocumentProcessor interface void runImpl(const CppTools::BaseEditorDocumentParser::UpdateParams &updateParams) override; diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index 92f253c5a8b..3744905b420 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -58,7 +58,7 @@ class ModelManagerSupportClang: public: ModelManagerSupportClang(); - ~ModelManagerSupportClang(); + ~ModelManagerSupportClang() override; CppTools::CppCompletionAssistProvider *completionAssistProvider() override; TextEditor::BaseHoverHandler *createHoverHandler() override; From 764925eb3a294e64edac2146caf109899cde56a7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 14:51:37 +0100 Subject: [PATCH 16/43] Clang: Send less data on unregisterTranslationUnit For unregisterTranslationUnit only the file path and the project part id is needed. Change-Id: I882d2fe07af094c07ea42413d6874539535a48ea Reviewed-by: Ivan Donchevskii --- .../clangeditordocumentprocessor.cpp | 31 ++++++------------- .../clangeditordocumentprocessor.h | 3 +- .../clangmodelmanagersupport.cpp | 2 +- 3 files changed, 12 insertions(+), 24 deletions(-) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index a282350f246..c7294d57c66 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -101,10 +101,8 @@ ClangEditorDocumentProcessor::~ClangEditorDocumentProcessor() m_parserWatcher.cancel(); m_parserWatcher.waitForFinished(); - if (m_projectPart) { - m_communicator.unregisterTranslationUnitsForEditor( - {ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); - } + if (m_projectPart) + unregisterTranslationUnitForEditor(); } void ClangEditorDocumentProcessor::runImpl( @@ -384,11 +382,6 @@ QFuture ClangEditorDocumentProcessor::toolTipInfo(const Q static_cast(column)); } -ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArguments() const -{ - return fileContainerWithArguments(m_projectPart.data()); -} - void ClangEditorDocumentProcessor::clearDiagnosticsWithFixIts() { m_diagnosticManager.clearDiagnosticsWithFixIts(); @@ -442,7 +435,7 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(CppTools::Pr if (m_projectPart) { if (projectPart->id() == m_projectPart->id()) return; - m_communicator.unregisterTranslationUnitsForEditor({fileContainerWithArguments()}); + unregisterTranslationUnitForEditor(); } m_communicator.registerTranslationUnitsForEditor( @@ -450,6 +443,13 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(CppTools::Pr ClangCodeModel::Utils::setLastSentDocumentRevision(filePath(), revision()); } +void ClangEditorDocumentProcessor::unregisterTranslationUnitForEditor() +{ + QTC_ASSERT(m_projectPart, return); + m_communicator.unregisterTranslationUnitsForEditor( + {ClangBackEnd::FileContainer(filePath(), m_projectPart->id())}); +} + void ClangEditorDocumentProcessor::updateTranslationUnitIfProjectPartExists() { if (m_projectPart) { @@ -621,17 +621,6 @@ static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart + precompiledHeaderOptions(filePath, projectPart); } -ClangBackEnd::FileContainer -ClangEditorDocumentProcessor::fileContainerWithArguments(CppTools::ProjectPart *projectPart) const -{ - const auto projectPartId = projectPart - ? Utf8String::fromString(projectPart->id()) - : Utf8String(); - const QStringList theFileArguments = fileArguments(filePath(), projectPart); - - return {filePath(), projectPartId, Utf8StringVector(theFileArguments), revision()}; -} - ClangBackEnd::FileContainer ClangEditorDocumentProcessor::fileContainerWithArgumentsAndDocumentContent( CppTools::ProjectPart *projectPart) const diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index e79525e736d..27c4b355dc0 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -92,7 +92,7 @@ public: int line, int column) override; - ClangBackEnd::FileContainer fileContainerWithArguments() const; + void unregisterTranslationUnitForEditor(); void clearDiagnosticsWithFixIts(); @@ -110,7 +110,6 @@ private: HeaderErrorDiagnosticWidgetCreator creatorForHeaderErrorDiagnosticWidget( const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic); ClangBackEnd::FileContainer simpleFileContainer(const QByteArray &codecName = QByteArray()) const; - ClangBackEnd::FileContainer fileContainerWithArguments(CppTools::ProjectPart *projectPart) const; ClangBackEnd::FileContainer fileContainerWithArgumentsAndDocumentContent( CppTools::ProjectPart *projectPart) const; ClangBackEnd::FileContainer fileContainerWithDocumentContent(const QString &projectpartId) const; diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 9495e6d5ebc..4de96c5a0ea 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -376,7 +376,7 @@ void ModelManagerSupportClang::unregisterTranslationUnitsWithProjectParts( { const auto processors = clangProcessorsWithProjectParts(projectPartIds); foreach (ClangEditorDocumentProcessor *processor, processors) { - m_communicator.unregisterTranslationUnitsForEditor({processor->fileContainerWithArguments()}); + processor->unregisterTranslationUnitForEditor(); processor->clearProjectPart(); processor->run(); } From cf94a15379ad72d0892c76bbdeff1a117e49cf31 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 15:58:02 +0100 Subject: [PATCH 17/43] Clang: Fix warning in switch() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit clangjobrequest.cpp:176:12: warning: enumeration value ‘RequestToolTip’ not handled in switch [-Wswitch] Change-Id: I09080548ba45ef99bc0c9e08b06d2ea3268b5662 Reviewed-by: Ivan Donchevskii --- src/tools/clangbackend/source/clangjobrequest.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tools/clangbackend/source/clangjobrequest.cpp b/src/tools/clangbackend/source/clangjobrequest.cpp index 2715ecde1c7..995102bcf0c 100644 --- a/src/tools/clangbackend/source/clangjobrequest.cpp +++ b/src/tools/clangbackend/source/clangjobrequest.cpp @@ -178,6 +178,7 @@ bool JobRequest::isTakeOverable() const case Type::CompleteCode: case Type::RequestReferences: case Type::FollowSymbol: + case Type::RequestToolTip: return true; // Discard this one as UpdateDocumentAnnotations will have the same effect. From 034f0209b01c3c774995e790c099bf7e422953e6 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 19 Jan 2018 11:55:28 +0100 Subject: [PATCH 18/43] ProjectTree: Fix crash working with resources Fix the notification of subtree changes to keep the project in the loop, so that it can adjust its list of known files. Ignoring that will cause crashes, e.g. when the ResourceEditor updates its subtree of the project. Task-number: QTCREATORBUG-19613 Change-Id: Ib7bb9afe48eb248cdf675ba2093b266fd728d7b2 Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/project.cpp | 34 +++++++++++--------- src/plugins/projectexplorer/project.h | 3 ++ src/plugins/projectexplorer/projectnodes.cpp | 13 +++++++- src/plugins/projectexplorer/projectnodes.h | 4 +++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index a291ef212bd..f2704e6119e 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -527,29 +527,33 @@ void Project::setRootProjectNode(ProjectNode *root) root = nullptr; } - ProjectTree::applyTreeManager(root); + if (root) { + ProjectTree::applyTreeManager(root); + root->setParentFolderNode(d->m_containerNode.get()); + } ProjectNode *oldNode = d->m_rootProjectNode; + d->m_rootProjectNode = root; - if (root) { - QVector nodeList; - root->forEachGenericNode([&nodeList](const Node *n) { + if (oldNode || root) + handleSubTreeChanged(d->m_containerNode.get()); + + delete oldNode; +} + +void Project::handleSubTreeChanged(FolderNode *node) +{ + QVector nodeList; + if (d->m_rootProjectNode) { + d->m_rootProjectNode->forEachGenericNode([&nodeList](const Node *n) { nodeList.append(n); }); Utils::sort(nodeList, &nodeLessThan); - d->m_sortedNodeList = nodeList; - root->setParentFolderNode(d->m_containerNode.get()); - // Only announce non-null root, null is only used when project is destroyed. - // In that case SessionManager::projectRemoved() triggers the update. - ProjectTree::emitSubtreeChanged(root); - emit fileListChanged(); - } else { - d->m_sortedNodeList.clear(); - if (oldNode != nullptr) - emit fileListChanged(); } + d->m_sortedNodeList = nodeList; - delete oldNode; + ProjectTree::emitSubtreeChanged(node); + emit fileListChanged(); } Target *Project::restoreTarget(const QVariantMap &data) diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 845b3c2b42b..28b50551895 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -48,6 +48,7 @@ namespace ProjectExplorer { class BuildInfo; class ContainerNode; class EditorConfiguration; +class FolderNode; class NamedWidget; class Node; class ProjectConfiguration; @@ -241,10 +242,12 @@ protected: virtual void projectLoaded(); // Called when the project is fully loaded. private: + void handleSubTreeChanged(FolderNode *node); void setActiveTarget(Target *target); ProjectPrivate *d; friend class Session; + friend class ContainerNode; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 25df41102db..ea4b780cabe 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -628,7 +628,7 @@ bool FolderNode::replaceSubtree(Node *oldNode, Node *newNode) } QTimer::singleShot(0, [oldNode]() { delete oldNode; }); } - ProjectTree::emitSubtreeChanged(this); + handleSubTreeChanged(this); return true; } @@ -879,6 +879,12 @@ bool FolderNode::isEmpty() const return m_nodes.isEmpty(); } +void FolderNode::handleSubTreeChanged(FolderNode *node) +{ + if (FolderNode *parent = parentFolderNode()) + parent->handleSubTreeChanged(node); +} + ContainerNode::ContainerNode(Project *project) : FolderNode(project->projectDirectory(), NodeType::Project), m_project(project) {} @@ -915,4 +921,9 @@ void ContainerNode::removeAllChildren() m_nodes.clear(); } +void ContainerNode::handleSubTreeChanged(FolderNode *node) +{ + m_project->handleSubTreeChanged(node); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index ddd828ee97a..34ad086a182 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -294,6 +294,8 @@ public: const FolderNode *asFolderNode() const override { return this; } protected: + virtual void handleSubTreeChanged(FolderNode *node); + QList m_nodes; QList m_locations; @@ -361,6 +363,8 @@ public: void removeAllChildren(); private: + void handleSubTreeChanged(FolderNode *node) final; + Project *m_project; }; From 63e47f903ff494870ad0a97e0e82409f96ee66f3 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Wed, 27 Dec 2017 13:56:54 +0100 Subject: [PATCH 19/43] Improve translated strings and make them consistent Change-Id: I88a6e6ceaa44b22539449037faa788caa9f349fc Reviewed-by: Leena Miettinen --- .../templates/wizards/projects/qtquickuiprototype/wizard.json | 2 +- src/plugins/android/androidbuildapkstep.cpp | 2 +- src/plugins/cmakeprojectmanager/servermodereader.cpp | 2 +- src/plugins/debugger/gdb/gdbengine.cpp | 2 +- src/plugins/ios/iosrunner.cpp | 2 +- src/plugins/projectexplorer/projectexplorersettingspage.ui | 2 +- src/plugins/projectexplorer/targetsettingspanel.cpp | 2 +- .../components/componentcore/componentcore_constants.h | 2 +- .../qmldesigner/designercore/instances/puppetcreator.cpp | 2 +- src/plugins/qmldesigner/documentwarningwidget.cpp | 3 ++- src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp | 2 +- src/plugins/scxmleditor/plugin_interface/stateitem.cpp | 2 +- 12 files changed, 13 insertions(+), 12 deletions(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json index 285631c96e1..62305835df1 100644 --- a/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquickuiprototype/wizard.json @@ -93,7 +93,7 @@ }, { "name": "UseVirtualKeyboard", - "trDisplayName": "Use Qt Virtual Keyboard.", + "trDisplayName": "Use Qt Virtual Keyboard", "type": "CheckBox", "data": { diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 9cf5aa76e02..d9c4e50f0eb 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -132,7 +132,7 @@ bool AndroidBuildApkStep::init(QList &earlierSteps) return false; } } else if (version->qtVersion() < QtSupport::QtVersionNumber(5, 4, 0)) { - emit addOutput(tr("The minimum Qt version required for Gradle build to work is %2. " + emit addOutput(tr("The minimum Qt version required for Gradle build to work is %1. " "It is recommended to install the latest Qt version.") .arg("5.4.0"), OutputFormat::Stderr); return false; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index 3e656d44c76..f4a6235e767 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -813,7 +813,7 @@ void ServerModeReader::addTargets(const QHashtype != CrossReference::TARGET) { if (path == targetPath) { if (bt->line >= 0) - dn = tr("%1 in line %3").arg(btName).arg(bt->line); + dn = tr("%1 in line %2").arg(btName).arg(bt->line); else dn = tr("%1").arg(btName); } else { diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 42a3d1e4619..62837bbf42d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4620,7 +4620,7 @@ void GdbEngine::handleFileExecAndSymbols(const DebuggerResponse &response) + ' ' + tr("This can be caused by a path length limitation " "in the core file.") + ' ' + tr("Try to specify the binary in " - "Debug > Start Debugging > Attach to Core."); + "Debug > Start Debugging > Load Core File."); notifyInferiorSetupFailedHelper(msg); } diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 6681a273544..6a923be786e 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -270,7 +270,7 @@ void IosRunner::handleGotInferiorPid(IosToolHandler *handler, const QString &bun if (prerequisiteOk) reportStarted(); else - reportFailure(tr("Could not get necessary ports the debugger connection.")); + reportFailure(tr("Could not get necessary ports for the debugger connection.")); } void IosRunner::handleAppOutput(IosToolHandler *handler, const QString &output) diff --git a/src/plugins/projectexplorer/projectexplorersettingspage.ui b/src/plugins/projectexplorer/projectexplorersettingspage.ui index 4a51b8b2742..328a8c2caf9 100644 --- a/src/plugins/projectexplorer/projectexplorersettingspage.ui +++ b/src/plugins/projectexplorer/projectexplorersettingspage.ui @@ -122,7 +122,7 @@ - Limit build output to + Limit build output to diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 955cedc9566..c98e670eae6 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -432,7 +432,7 @@ public: QPushButton *closeAnyway = box.addButton(tr("Cancel Build and Disable Kit in This Project"), QMessageBox::AcceptRole); QPushButton *cancelClose = box.addButton(tr("Do Not Remove"), QMessageBox::RejectRole); box.setDefaultButton(cancelClose); - box.setWindowTitle(tr("Disable Kit %1 in This Project?").arg(kitName)); + box.setWindowTitle(tr("Disable Kit \"%1\" in This Project?").arg(kitName)); box.setText(tr("The kit %1 is currently being built.").arg(kitName)); box.setInformativeText(tr("Do you want to cancel the build process and remove the kit anyway?")); box.exec(); diff --git a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h index ce7952609ac..0035b90fad3 100644 --- a/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h +++ b/src/plugins/qmldesigner/components/componentcore/componentcore_constants.h @@ -137,7 +137,7 @@ const char lowerToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Lower s const char resetSizeToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset size and use implicit size."); const char resetPositionTooltip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset position and use implicit position."); -const char anchorsFillToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill selected item to parent. "); +const char anchorsFillToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Fill selected item to parent."); const char anchorsResetToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Reset anchors for selected item."); const char layoutColumnLayoutToolTip[] = QT_TRANSLATE_NOOP("QmlDesignerContextMenu", "Layout selected items in column layout."); diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 2b9092e2867..6efc88a7b8e 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -227,7 +227,7 @@ QProcess *PuppetCreator::puppetProcess(const QString &puppetPath, #endif if (debugPuppet == puppetMode || debugPuppet == "all") { QMessageBox::information(Core::ICore::dialogParent(), - QCoreApplication::translate("PuppetCreator", "Puppet is starting ..."), + QCoreApplication::translate("PuppetCreator", "Puppet is starting..."), QCoreApplication::translate("PuppetCreator", "You can now attach your debugger to the %1 puppet with process id: %2.") .arg(puppetMode, QString::number(puppetProcess->processId()))); } diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index a6c03034640..6afe9b27144 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -63,7 +63,8 @@ DocumentWarningWidget::DocumentWarningWidget(QWidget *parent) m_messageLabel->setForegroundRole(QPalette::ToolTipText); m_messageLabel->setWordWrap(true); - m_ignoreWarningsCheckBox->setText(tr("Ignore always these unsupported Qt Quick Designer warnings.")); + m_ignoreWarningsCheckBox->setText(tr("Always ignore these warnings about features " + "not supported by Qt Quick Designer.")); connect(m_navigateLabel, &QLabel::linkActivated, this, [=](const QString &link) { if (link == QLatin1String("goToCode")) { diff --git a/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp b/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp index 73761925818..6422c22292f 100644 --- a/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/idwarningitem.cpp @@ -34,7 +34,7 @@ IdWarningItem::IdWarningItem(QGraphicsItem *parent) setSeverity(OutputPane::Warning::ErrorType); setTypeName(tr("State")); setDescription(tr("Each state must have a unique ID.")); - setReason(tr("Missing ID")); + setReason(tr("Missing ID.")); setX(-boundingRect().width()); } diff --git a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp index edc2562ccfe..01fd5a994b5 100644 --- a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp @@ -350,7 +350,7 @@ void StateItem::selectedMenuAction(const QAction *action) break; } case TagUtils::Relayout: { - document->undoStack()->beginMacro(tr("Relayout")); + document->undoStack()->beginMacro(tr("Re-Layout")); doLayout(depth()); document->undoStack()->endMacro(); break; From f9c959cee24b7a9837383379d104886d95360e56 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 22 Jan 2018 10:45:04 +0100 Subject: [PATCH 20/43] QmlJSEditor: Move ownership of QmlJSTextMarks to document Task-number: QTCREATORBUG-19607 Change-Id: I65fa11b43dcbe3c28ab100a1636ad592cfff5a4d Reviewed-by: David Schulz Reviewed-by: Christian Stenger --- src/plugins/qmljseditor/qmljseditor.cpp | 60 ------------------- src/plugins/qmljseditor/qmljseditor.h | 10 ---- .../qmljseditor/qmljseditordocument.cpp | 60 +++++++++++++++++++ .../qmljseditor/qmljseditordocument_p.h | 9 +++ 4 files changed, 69 insertions(+), 70 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 01e37a3e4ca..946edbd078b 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -34,7 +34,6 @@ #include "qmljshighlighter.h" #include "qmljshoverhandler.h" #include "qmljsquickfixassist.h" -#include "qmljstextmark.h" #include "qmloutlinemodel.h" #include @@ -203,14 +202,12 @@ static void appendExtraSelectionsForMessages( void QmlJSEditorWidget::updateCodeWarnings(Document::Ptr doc) { - cleanDiagnosticMarks(); if (doc->ast()) { setExtraSelections(CodeWarningsSelection, QList()); } else if (doc->language().isFullySupportedLanguage()) { // show parsing errors QList selections; appendExtraSelectionsForMessages(&selections, doc->diagnosticMessages(), document()); - createTextMarks(doc->diagnosticMessages()); setExtraSelections(CodeWarningsSelection, selections); } else { setExtraSelections(CodeWarningsSelection, QList()); @@ -935,8 +932,6 @@ void QmlJSEditorWidget::semanticInfoUpdated(const SemanticInfo &semanticInfo) } } - createTextMarks(semanticInfo); - updateUses(); } @@ -978,61 +973,6 @@ bool QmlJSEditorWidget::hideContextPane() return b; } -void QmlJSEditorWidget::createTextMarks(const QList &diagnostics) -{ - for (const DiagnosticMessage &diagnostic : diagnostics) { - const auto onMarkRemoved = [this](QmlJSTextMark *mark) { - m_diagnosticMarks.removeAll(mark); - delete mark; - }; - - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - diagnostic, onMarkRemoved); - m_diagnosticMarks.append(mark); - textDocument()->addMark(mark); - } -} - -static void cleanMarks(QVector *marks, TextDocument *doc) -{ - for (TextEditor::TextMark *mark : *marks) { - doc->removeMark(mark); - delete mark; - } - marks->clear(); -} - -void QmlJSEditorWidget::cleanDiagnosticMarks() -{ - cleanMarks(&m_diagnosticMarks, textDocument()); -} - -void QmlJSEditorWidget::createTextMarks(const SemanticInfo &info) -{ - cleanSemanticMarks(); - const auto onMarkRemoved = [this](QmlJSTextMark *mark) { - m_semanticMarks.removeAll(mark); - delete mark; - }; - for (const DiagnosticMessage &diagnostic : info.semanticMessages) { - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - diagnostic, onMarkRemoved); - m_semanticMarks.append(mark); - textDocument()->addMark(mark); - } - for (const QmlJS::StaticAnalysis::Message &message : info.staticAnalysisMessages) { - auto mark = new QmlJSTextMark(textDocument()->filePath().toString(), - message, onMarkRemoved); - m_semanticMarks.append(mark); - textDocument()->addMark(mark); - } -} - -void QmlJSEditorWidget::cleanSemanticMarks() -{ - cleanMarks(&m_semanticMarks, textDocument()); -} - AssistInterface *QmlJSEditorWidget::createAssistInterface( AssistKind assistKind, AssistReason reason) const diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 7d68cf318f3..3e055d69c08 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -47,8 +47,6 @@ namespace QmlJS { namespace AST { class UiObjectMember; } } -namespace TextEditor { class TextMark; } - namespace QmlJSEditor { class QmlJSEditorDocument; @@ -129,14 +127,6 @@ private: QmlJS::IContextPane *m_contextPane = nullptr; int m_oldCursorPosition = -1; - void createTextMarks(const QList &diagnostics); - void cleanDiagnosticMarks(); - QVector m_diagnosticMarks; - - void createTextMarks(const QmlJSTools::SemanticInfo &info); - void cleanSemanticMarks(); - QVector m_semanticMarks; - FindReferences *m_findReferences; }; diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 387c1d719fe..79c348ecc4d 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -32,6 +32,7 @@ #include "qmljsquickfixassist.h" #include "qmljssemantichighlighter.h" #include "qmljssemanticinfoupdater.h" +#include "qmljstextmark.h" #include "qmloutlinemodel.h" #include @@ -521,10 +522,13 @@ void QmlJSEditorDocumentPrivate::onDocumentUpdated(Document::Ptr doc) if (doc->editorRevision() != q->document()->revision()) return; + cleanDiagnosticMarks(); if (doc->ast()) { // got a correctly parsed (or recovered) file. m_semanticInfoDocRevision = doc->editorRevision(); m_semanticInfoUpdater->update(doc, ModelManagerInterface::instance()->snapshot()); + } else if (doc->language().isFullySupportedLanguage()) { + createTextMarks(doc->diagnosticMessages()); } emit q->updateCodeWarnings(doc); } @@ -573,6 +577,7 @@ void QmlJSEditorDocumentPrivate::acceptNewSemanticInfo(const SemanticInfo &seman } } + createTextMarks(m_semanticInfo); emit q->semanticInfoUpdated(m_semanticInfo); // calls triggerPendingUpdates as necessary } @@ -584,6 +589,61 @@ void QmlJSEditorDocumentPrivate::updateOutlineModel() m_outlineModel->update(m_semanticInfo); } +static void cleanMarks(QVector *marks, TextEditor::TextDocument *doc) +{ + for (TextEditor::TextMark *mark : *marks) { + doc->removeMark(mark); + delete mark; + } + marks->clear(); +} + +void QmlJSEditorDocumentPrivate::createTextMarks(const QList &diagnostics) +{ + for (const DiagnosticMessage &diagnostic : diagnostics) { + const auto onMarkRemoved = [this](QmlJSTextMark *mark) { + m_diagnosticMarks.removeAll(mark); + delete mark; + }; + + auto mark = new QmlJSTextMark(q->filePath().toString(), + diagnostic, onMarkRemoved); + m_diagnosticMarks.append(mark); + q->addMark(mark); + } +} + +void QmlJSEditorDocumentPrivate::cleanDiagnosticMarks() +{ + cleanMarks(&m_diagnosticMarks, q); +} + +void QmlJSEditorDocumentPrivate::createTextMarks(const SemanticInfo &info) +{ + cleanSemanticMarks(); + const auto onMarkRemoved = [this](QmlJSTextMark *mark) { + m_semanticMarks.removeAll(mark); + delete mark; + }; + for (const DiagnosticMessage &diagnostic : info.semanticMessages) { + auto mark = new QmlJSTextMark(q->filePath().toString(), + diagnostic, onMarkRemoved); + m_semanticMarks.append(mark); + q->addMark(mark); + } + for (const QmlJS::StaticAnalysis::Message &message : info.staticAnalysisMessages) { + auto mark = new QmlJSTextMark(q->filePath().toString(), + message, onMarkRemoved); + m_semanticMarks.append(mark); + q->addMark(mark); + } +} + +void QmlJSEditorDocumentPrivate::cleanSemanticMarks() +{ + cleanMarks(&m_semanticMarks, q); +} + } // Internal QmlJSEditorDocument::QmlJSEditorDocument() diff --git a/src/plugins/qmljseditor/qmljseditordocument_p.h b/src/plugins/qmljseditor/qmljseditordocument_p.h index 854b81519f8..11d639cb596 100644 --- a/src/plugins/qmljseditor/qmljseditordocument_p.h +++ b/src/plugins/qmljseditor/qmljseditordocument_p.h @@ -32,6 +32,8 @@ #include #include +namespace TextEditor { class TextMark; } + namespace QmlJSEditor { class QmlJSEditorDocument; @@ -57,6 +59,11 @@ public: void acceptNewSemanticInfo(const QmlJSTools::SemanticInfo &semanticInfo); void updateOutlineModel(); + void createTextMarks(const QList &diagnostics); + void cleanDiagnosticMarks(); + void createTextMarks(const QmlJSTools::SemanticInfo &info); + void cleanSemanticMarks(); + public: QmlJSEditorDocument *q = nullptr; QTimer m_updateDocumentTimer; // used to compress multiple document changes @@ -71,6 +78,8 @@ public: bool m_firstSementicInfo = true; QTimer m_updateOutlineModelTimer; Internal::QmlOutlineModel *m_outlineModel = nullptr; + QVector m_diagnosticMarks; + QVector m_semanticMarks; }; } // Internal From a4ff3423e9b6793c04f21f084e7b8139b4422714 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Thu, 4 Jan 2018 12:11:55 +0100 Subject: [PATCH 21/43] Squish: Update Qt version names and constants As a preparation for using Qt 5.10, these need to handle two-digit minor versions. Change-Id: I2a47606ee801a28df12d75323b480f8ee583893b Reviewed-by: Christian Stenger --- .../mac/QtProject/qtcreator/profiles.xml | 6 +-- .../unix/QtProject/qtcreator/profiles.xml | 8 +-- .../windows/QtProject/qtcreator/profiles.xml | 8 +-- tests/system/shared/classes.py | 52 +++++++++++-------- tests/system/shared/project.py | 45 +++++++--------- tests/system/suite_APTW/tst_APTW03/test.py | 2 +- tests/system/suite_CCOM/tst_CCOM01/test.py | 4 +- tests/system/suite_CCOM/tst_CCOM02/test.py | 2 +- tests/system/suite_CSUP/tst_CSUP06/test.py | 2 +- tests/system/suite_QMLS/tst_QMLS03/test.py | 4 +- tests/system/suite_WELP/tst_WELP02/test.py | 2 +- .../tst_cli_output_console/test.py | 4 +- .../tst_debug_empty_main/test.py | 3 +- .../suite_editors/tst_qml_editor/test.py | 2 +- .../tst_build_speedcrunch/test.py | 2 +- .../suite_general/tst_opencreator_qbs/test.py | 4 +- .../suite_general/tst_openqt_creator/test.py | 4 +- .../suite_general/tst_remove_kits/test.py | 2 +- .../suite_general/tst_rename_file/test.py | 2 +- .../tst_session_handling/test.py | 6 +-- .../suite_qtquick/tst_qml_outline/test.py | 4 +- .../tst_qtquick_creation/test.py | 2 +- .../tst_qtquick_creation3/test.py | 4 +- .../tst_qtquick_creation4/test.py | 2 +- 24 files changed, 90 insertions(+), 86 deletions(-) diff --git a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml index 3df47f6a77f..a3f0a20048a 100644 --- a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml @@ -49,7 +49,7 @@ :///DESKTOP/// {fc5f34fd-e703-4f4c-85ce-ea5bf5869e6a} - Desktop 561 default + Desktop 5.6.1 default false @@ -75,7 +75,7 @@ :///DESKTOP/// {1dcb5509-1670-470d-80a5-8a988f36e4e2} - Desktop 487 default + Desktop 4.8.7 default false @@ -101,7 +101,7 @@ :///DESKTOP/// {a1e860d1-c241-4abf-80fe-cf0c9f0a43b3} - Desktop 531 default + Desktop 5.3.1 default false diff --git a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml index 265a81a89b0..1f56742fe09 100644 --- a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml @@ -44,7 +44,7 @@ :///DESKTOP/// {1dcb5509-1670-470d-80a5-8a988f36e4e2} - Desktop 487 default + Desktop 4.8.7 default false @@ -66,7 +66,7 @@ :///DESKTOP/// {e91398ba-6443-4b02-b416-782a70d9df90} - Desktop 531 default + Desktop 5.3.1 default false @@ -90,7 +90,7 @@ :///DESKTOP/// {8ca91e21-c12e-4876-85b3-4b2141708acb} - Desktop 541 GCC + Desktop 5.4.1 GCC false @@ -114,7 +114,7 @@ :///DESKTOP/// {542217c7-ce0f-48f7-843b-d4fad339688d} - Desktop 561 default + Desktop 5.6.1 default false diff --git a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml index 8baf4c029a1..70eda53be2e 100644 --- a/tests/system/settings/windows/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/windows/QtProject/qtcreator/profiles.xml @@ -25,7 +25,7 @@ :///DESKTOP/// {9b35bbe6-25a7-4cce-ba07-487c795f5265} - Desktop 487 default + Desktop 4.8.7 default false @@ -53,7 +53,7 @@ :///DESKTOP/// {6a95566e-8372-4372-8286-ef73af7de191} - Desktop 531 default + Desktop 5.3.1 default false @@ -81,7 +81,7 @@ :///DESKTOP/// {10cf33c5-e36d-4a49-a8c7-086f3cf59695} - Desktop 541 GCC + Desktop 5.4.1 GCC false @@ -109,7 +109,7 @@ :///DESKTOP/// {f9c7858c-d167-4b78-847a-91943bd0af07} - Desktop 561 default + Desktop 5.6.1 default false diff --git a/tests/system/shared/classes.py b/tests/system/shared/classes.py index eb74c9ad0db..402181cfa54 100644 --- a/tests/system/shared/classes.py +++ b/tests/system/shared/classes.py @@ -30,11 +30,11 @@ import operator class Targets: ALL_TARGETS = tuple(map(lambda x: 2 ** x , range(5))) - (DESKTOP_487_DEFAULT, + (DESKTOP_4_8_7_DEFAULT, EMBEDDED_LINUX, - DESKTOP_531_DEFAULT, - DESKTOP_541_GCC, - DESKTOP_561_DEFAULT) = ALL_TARGETS + DESKTOP_5_3_1_DEFAULT, + DESKTOP_5_4_1_GCC, + DESKTOP_5_6_1_DEFAULT) = ALL_TARGETS @staticmethod def availableTargetClasses(): @@ -42,7 +42,7 @@ class Targets: if platform.system() in ('Windows', 'Microsoft'): availableTargets.remove(Targets.EMBEDDED_LINUX) elif platform.system() == 'Darwin': - availableTargets.remove(Targets.DESKTOP_541_GCC) + availableTargets.remove(Targets.DESKTOP_5_4_1_GCC) return availableTargets @staticmethod @@ -54,20 +54,20 @@ class Targets: @staticmethod def qt4Classes(): - return (Targets.DESKTOP_487_DEFAULT | Targets.EMBEDDED_LINUX) + return (Targets.DESKTOP_4_8_7_DEFAULT | Targets.EMBEDDED_LINUX) @staticmethod def getStringForTarget(target): - if target == Targets.DESKTOP_487_DEFAULT: - return "Desktop 487 default" + if target == Targets.DESKTOP_4_8_7_DEFAULT: + return "Desktop 4.8.7 default" elif target == Targets.EMBEDDED_LINUX: return "Embedded Linux" - elif target == Targets.DESKTOP_531_DEFAULT: - return "Desktop 531 default" - elif target == Targets.DESKTOP_541_GCC: - return "Desktop 541 GCC" - elif target == Targets.DESKTOP_561_DEFAULT: - return "Desktop 561 default" + elif target == Targets.DESKTOP_5_3_1_DEFAULT: + return "Desktop 5.3.1 default" + elif target == Targets.DESKTOP_5_4_1_GCC: + return "Desktop 5.4.1 GCC" + elif target == Targets.DESKTOP_5_6_1_DEFAULT: + return "Desktop 5.6.1 default" else: return None @@ -83,7 +83,7 @@ class Targets: @staticmethod def getDefaultKit(): - return Targets.DESKTOP_531_DEFAULT + return Targets.DESKTOP_5_3_1_DEFAULT # this class holds some constants for easier usage inside the Projects view class ProjectSettings: @@ -169,9 +169,9 @@ class Qt5Path: @staticmethod def getPaths(pathSpec): - qt5targets = [Targets.DESKTOP_531_DEFAULT, Targets.DESKTOP_561_DEFAULT] + qt5targets = [Targets.DESKTOP_5_3_1_DEFAULT, Targets.DESKTOP_5_6_1_DEFAULT] if platform.system() != 'Darwin': - qt5targets.append(Targets.DESKTOP_541_GCC) + qt5targets.append(Targets.DESKTOP_5_4_1_GCC) if pathSpec == Qt5Path.DOCS: return map(lambda target: Qt5Path.docsPath(target), qt5targets) elif pathSpec == Qt5Path.EXAMPLES: @@ -185,7 +185,7 @@ class Qt5Path: if target not in Targets.ALL_TARGETS: raise Exception("Unexpected target '%s'" % str(target)) - matcher = re.match("^Desktop (5\\d{2}).*$", Targets.getStringForTarget(target)) + matcher = re.match("^Desktop (5\.\\d{1,2}\.\\d{1,2}).*$", Targets.getStringForTarget(target)) if matcher is None: raise Exception("Currently this is supported for Desktop Qt5 only, got target '%s'" % str(Targets.getStringForTarget(target))) @@ -211,9 +211,18 @@ class Qt5Path: return os.path.expanduser("~/Qt5.%d.1" % qt5Minor) @staticmethod - def examplesPath(target): + def toVersionTuple(versionString): + return tuple(map(__builtin__.int, versionString.split("."))) + + @staticmethod + def getQtMinorAndPatchVersion(target): qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) - qtMinorVersion = __builtin__.int(qtVersionStr[1]) + versionTuple = Qt5Path.toVersionTuple(qtVersionStr) + return versionTuple[1], versionTuple[2] + + @staticmethod + def examplesPath(target): + qtMinorVersion, qtPatchVersion = Qt5Path.getQtMinorAndPatchVersion(target) if qtMinorVersion == 2: path = "examples" else: @@ -223,8 +232,7 @@ class Qt5Path: @staticmethod def docsPath(target): - qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) - qtMinorVersion = __builtin__.int(qtVersionStr[1]) + qtMinorVersion, qtPatchVersion = Qt5Path.getQtMinorAndPatchVersion(target) if qtMinorVersion == 2: path = "doc" else: diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 06b67e18c74..1a35e81aa50 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -73,7 +73,7 @@ def openCmakeProject(projectPath, buildDir): invokeMenuItem("File", "Open File or Project...") selectFromFileDialog(projectPath) __chooseTargets__([]) # uncheck all - __chooseTargets__([Targets.DESKTOP_487_DEFAULT], additionalFunc=additionalFunction) + __chooseTargets__([Targets.DESKTOP_4_8_7_DEFAULT], additionalFunc=additionalFunction) clickButton(waitForObject(":Qt Creator.Configure Project_QPushButton")) return True @@ -190,28 +190,23 @@ def __verifyFileCreation__(path, expectedFiles): test.verify(os.path.exists(filename), "Checking if '" + filename + "' was created") def __modifyAvailableTargets__(available, requiredQt, asStrings=False): - threeDigits = re.compile("\d{3}") - requiredQtVersion = requiredQt.replace(".", "") + "0" + versionFinder = re.compile("^Desktop (\\d{1}\.\\d{1,2}\.\\d{1,2}).*$") tmp = list(available) # we need a deep copy + if Qt5Path.toVersionTuple(requiredQt) > (4,8,7): + toBeRemoved = Targets.EMBEDDED_LINUX + if asStrings: + toBeRemoved = Targets.getStringForTarget(toBeRemoved) + if toBeRemoved in available: + available.remove(toBeRemoved) for currentItem in tmp: if asStrings: item = currentItem else: item = Targets.getStringForTarget(currentItem) - found = threeDigits.search(item) + found = versionFinder.search(item) if found: - if found.group(0) < requiredQtVersion: - # Quick 1.1 supports 4.7.4 only for running, debugging is unsupported - # so the least required version is 4.8, but 4.7.4 will be still listed - if not (requiredQtVersion == "480" and found.group(0) == "474"): - available.remove(currentItem) - if requiredQtVersion > "487": - toBeRemoved = [Targets.EMBEDDED_LINUX] - if asStrings: - toBeRemoved = Targets.getTargetsAsStrings(toBeRemoved) - for t in toBeRemoved: - if t in available: - available.remove(t) + if Qt5Path.toVersionTuple(found.group(1)) < Qt5Path.toVersionTuple(requiredQt): + available.remove(currentItem) # Creates a Qt GUI project # param path specifies where to create the project @@ -320,7 +315,7 @@ def createNewQtQuickUI(workingDir, qtVersion = "5.6"): return projectName -def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_531_DEFAULT]): +def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_5_3_1_DEFAULT]): available = __createProjectOrFileSelectType__(" Library", "Qt Quick 2 Extension Plugin") if workingDir == None: workingDir = tempDir() @@ -349,7 +344,7 @@ def createEmptyQtProject(workingDir=None, projectName=None, targets=Targets.desk __createProjectHandleLastPage__() return projectName, checkedTargets -def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DESKTOP_487_DEFAULT], +def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DESKTOP_4_8_7_DEFAULT], plainC=False, cmake=False, qbs=False): if plainC: template = "Plain C Application" @@ -378,7 +373,7 @@ def createNewNonQtProject(workingDir=None, projectName=None, target=[Targets.DES return projectName def createNewCPPLib(projectDir = None, projectName = None, className = None, fromWelcome = False, - target = [Targets.DESKTOP_487_DEFAULT], isStatic = False, modules = ["QtCore"]): + target = [Targets.DESKTOP_4_8_7_DEFAULT], isStatic = False, modules = ["QtCore"]): available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True) if isStatic: libType = LibType.STATIC @@ -396,7 +391,7 @@ def createNewCPPLib(projectDir = None, projectName = None, className = None, fro return checkedTargets, projectName, className def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWelcome=False, - target=[Targets.DESKTOP_487_DEFAULT], baseClass="QGenericPlugin"): + target=[Targets.DESKTOP_4_8_7_DEFAULT], baseClass="QGenericPlugin"): available = __createProjectOrFileSelectType__(" Library", "C++ Library", fromWelcome, True) if projectDir == None: projectDir = tempDir() @@ -414,7 +409,7 @@ def createNewQtPlugin(projectDir=None, projectName=None, className=None, fromWel # parameter additionalFunc function to be executed inside the detailed view of each chosen kit # if present, 'Details' button will be clicked, function will be executed, # 'Details' button will be clicked again -def __chooseTargets__(targets=[Targets.DESKTOP_487_DEFAULT], availableTargets=None, additionalFunc=None): +def __chooseTargets__(targets=[Targets.DESKTOP_4_8_7_DEFAULT], availableTargets=None, additionalFunc=None): if availableTargets != None: available = availableTargets else: @@ -645,7 +640,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False): else: version = None if 'only available with Qt 5.6' in text: - result = [Targets.DESKTOP_561_DEFAULT] + result = [Targets.DESKTOP_5_6_1_DEFAULT] elif 'available with Qt 5.7 and later' in text: result = [] # FIXME we have currently no Qt5.7+ available in predefined settings elif 'Supported Platforms' in text: @@ -653,12 +648,12 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False): result = [] if 'Desktop' in supports: if version == None or version < "5.0": - result.append(Targets.DESKTOP_487_DEFAULT) + result.append(Targets.DESKTOP_4_8_7_DEFAULT) if platform.system() in ("Linux", "Darwin"): result.append(Targets.EMBEDDED_LINUX) - result.extend([Targets.DESKTOP_531_DEFAULT, Targets.DESKTOP_561_DEFAULT]) + result.extend([Targets.DESKTOP_5_3_1_DEFAULT, Targets.DESKTOP_5_6_1_DEFAULT]) if platform.system() != 'Darwin': - result.append(Targets.DESKTOP_541_GCC) + result.append(Targets.DESKTOP_5_4_1_GCC) elif 'Platform independent' in text: result = Targets.desktopTargetClasses() else: diff --git a/tests/system/suite_APTW/tst_APTW03/test.py b/tests/system/suite_APTW/tst_APTW03/test.py index d1ef6a5f804..2ceef47b708 100644 --- a/tests/system/suite_APTW/tst_APTW03/test.py +++ b/tests/system/suite_APTW/tst_APTW03/test.py @@ -85,7 +85,7 @@ def main(): target=targets) virtualFunctionsAdded = False for kit, config in iterateBuildConfigs(len(checkedTargets), "Debug"): - is487Kit = "487" in Targets.getStringForTarget(checkedTargets[kit]) + is487Kit = checkedTargets[kit] in (Targets.DESKTOP_4_8_7_DEFAULT, Targets.EMBEDDED_LINUX) verifyBuildConfig(len(checkedTargets), kit, config, True, True) if virtualFunctionsAdded and platform.system() in ('Microsoft', 'Windows') and is487Kit: test.warning("Skipping building of Qt4.8 targets because of QTCREATORBUG-12251.") diff --git a/tests/system/suite_CCOM/tst_CCOM01/test.py b/tests/system/suite_CCOM/tst_CCOM01/test.py index 8e336c8567a..6e75e634f2e 100755 --- a/tests/system/suite_CCOM/tst_CCOM01/test.py +++ b/tests/system/suite_CCOM/tst_CCOM01/test.py @@ -28,7 +28,7 @@ source("../../shared/qtcreator.py") # entry of test def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -41,7 +41,7 @@ def main(): return # open example project, supports only Qt 5 targets = Targets.desktopTargetClasses() - targets.remove(Targets.DESKTOP_487_DEFAULT) + targets.remove(Targets.DESKTOP_4_8_7_DEFAULT) checkedTargets = openQmakeProject(examplePath, targets) # build and wait until finished - on all build configurations availableConfigs = iterateBuildConfigs(len(checkedTargets)) diff --git a/tests/system/suite_CCOM/tst_CCOM02/test.py b/tests/system/suite_CCOM/tst_CCOM02/test.py index 2a59212706b..f6a3232bd88 100755 --- a/tests/system/suite_CCOM/tst_CCOM02/test.py +++ b/tests/system/suite_CCOM/tst_CCOM02/test.py @@ -29,7 +29,7 @@ source("../../shared/qtcreator.py") # entry of test def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_CSUP/tst_CSUP06/test.py b/tests/system/suite_CSUP/tst_CSUP06/test.py index f703669755e..40d924d2c5b 100644 --- a/tests/system/suite_CSUP/tst_CSUP06/test.py +++ b/tests/system/suite_CSUP/tst_CSUP06/test.py @@ -165,7 +165,7 @@ def main(): with TestSection(getCodeModelString(useClang)): if not startCreator(useClang): continue - openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(examplePath, [Targets.DESKTOP_5_3_1_DEFAULT]) checkCodeModelSettings(useClang) if not openDocument("cplusplus-tools.Sources.main\\.cpp"): earlyExit("Failed to open main.cpp.") diff --git a/tests/system/suite_QMLS/tst_QMLS03/test.py b/tests/system/suite_QMLS/tst_QMLS03/test.py index 3682816da52..11408d700b5 100644 --- a/tests/system/suite_QMLS/tst_QMLS03/test.py +++ b/tests/system/suite_QMLS/tst_QMLS03/test.py @@ -67,7 +67,7 @@ def checkUsages(resultsView, expectedResults, directory): def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") proFile = "animation.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -80,7 +80,7 @@ def main(): if not startedWithoutPluginError(): return # open example project - openQmakeProject(examplePath, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(examplePath, [Targets.DESKTOP_5_3_1_DEFAULT]) # open qml file openDocument("animation.Resources.animation\\.qrc./animation.basics.color-animation\\.qml") # get editor diff --git a/tests/system/suite_WELP/tst_WELP02/test.py b/tests/system/suite_WELP/tst_WELP02/test.py index ae7b22e9345..e809a753df7 100644 --- a/tests/system/suite_WELP/tst_WELP02/test.py +++ b/tests/system/suite_WELP/tst_WELP02/test.py @@ -65,7 +65,7 @@ def checkTypeAndProperties(typePropertiesDetails): def main(): # prepare example project - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation") if not neededFilePresent(sourceExample): return diff --git a/tests/system/suite_debugger/tst_cli_output_console/test.py b/tests/system/suite_debugger/tst_cli_output_console/test.py index 7acaedc0fe3..1add5fe028c 100644 --- a/tests/system/suite_debugger/tst_cli_output_console/test.py +++ b/tests/system/suite_debugger/tst_cli_output_console/test.py @@ -71,10 +71,10 @@ def main(): appOutput = str(waitForObject(":Qt Creator_Core::OutputWindow").plainText) verifyOutput(appOutput, outputStdOut, "std::cout", "Application Output") verifyOutput(appOutput, outputStdErr, "std::cerr", "Application Output") - if (checkedTargets[kit] == Targets.DESKTOP_541_GCC + if (checkedTargets[kit] == Targets.DESKTOP_5_4_1_GCC and platform.system() in ('Windows', 'Microsoft')): test.log("Skipping qDebug() from %s (unstable, QTCREATORBUG-15067)" - % Targets.getStringForTarget(Targets.DESKTOP_541_GCC)) + % Targets.getStringForTarget(Targets.DESKTOP_5_4_1_GCC)) else: verifyOutput(appOutput, outputQDebug, "qDebug()", "Application Output") diff --git a/tests/system/suite_debugger/tst_debug_empty_main/test.py b/tests/system/suite_debugger/tst_debug_empty_main/test.py index 524499c8162..230e3793a87 100644 --- a/tests/system/suite_debugger/tst_debug_empty_main/test.py +++ b/tests/system/suite_debugger/tst_debug_empty_main/test.py @@ -61,7 +61,8 @@ def main(): for name,isC in {"C":True, "CPP":False}.items(): for singleTarget in targets: workingDir = tempDir() - qtVersion = re.search("\d{3}", Targets.getStringForTarget(singleTarget)).group() + qtVersion = re.search("\\d{1}\.\\d{1,2}\.\\d{1,2}", Targets.getStringForTarget(singleTarget)).group() + qtVersion = qtVersion.replace(".", "") projectName = createNewNonQtProject(workingDir, "Sample%s%s" % (name, qtVersion), [singleTarget], isC) if projectName == None: diff --git a/tests/system/suite_editors/tst_qml_editor/test.py b/tests/system/suite_editors/tst_qml_editor/test.py index 8854035e6a9..c61b7aa43de 100644 --- a/tests/system/suite_editors/tst_qml_editor/test.py +++ b/tests/system/suite_editors/tst_qml_editor/test.py @@ -26,7 +26,7 @@ source("../../shared/qtcreator.py") def main(): - target = Targets.DESKTOP_531_DEFAULT + target = Targets.DESKTOP_5_3_1_DEFAULT sourceExample = os.path.join(Qt5Path.examplesPath(target), "declarative/keyinteraction/focus") proFile = "focus.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_general/tst_build_speedcrunch/test.py b/tests/system/suite_general/tst_build_speedcrunch/test.py index 34be2beafa5..686943b422a 100644 --- a/tests/system/suite_general/tst_build_speedcrunch/test.py +++ b/tests/system/suite_general/tst_build_speedcrunch/test.py @@ -42,7 +42,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - checkedTargets = openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_487_DEFAULT]) + checkedTargets = openQmakeProject(SpeedCrunchPath, [Targets.DESKTOP_4_8_7_DEFAULT]) progressBarWait(30000) fancyToolButton = waitForObject(":*Qt Creator_Core::Internal::FancyToolButton") diff --git a/tests/system/suite_general/tst_opencreator_qbs/test.py b/tests/system/suite_general/tst_opencreator_qbs/test.py index e8b17b607d4..60cc0d34444 100644 --- a/tests/system/suite_general/tst_opencreator_qbs/test.py +++ b/tests/system/suite_general/tst_opencreator_qbs/test.py @@ -37,8 +37,8 @@ def main(): if not startedWithoutPluginError(): return openQbsProject(pathCreator) - if not addAndActivateKit(Targets.DESKTOP_561_DEFAULT): - test.fatal("Failed to activate '%s'" % Targets.getStringForTarget(Targets.DESKTOP_541_GCC)) + if not addAndActivateKit(Targets.DESKTOP_5_6_1_DEFAULT): + test.fatal("Failed to activate '%s'" % Targets.getStringForTarget(Targets.DESKTOP_5_4_1_GCC)) invokeMenuItem("File", "Exit") return test.log("Start parsing project") diff --git a/tests/system/suite_general/tst_openqt_creator/test.py b/tests/system/suite_general/tst_openqt_creator/test.py index b2846b5e971..6d401784704 100644 --- a/tests/system/suite_general/tst_openqt_creator/test.py +++ b/tests/system/suite_general/tst_openqt_creator/test.py @@ -36,12 +36,12 @@ def main(): return runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton') - openQmakeProject(pathSpeedcrunch, [Targets.DESKTOP_487_DEFAULT]) + openQmakeProject(pathSpeedcrunch, [Targets.DESKTOP_4_8_7_DEFAULT]) # Wait for parsing to complete waitFor("runButton.enabled", 30000) # Starting before opening, because this is where Creator froze (QTCREATORBUG-10733) startopening = datetime.utcnow() - openQmakeProject(pathCreator, [Targets.DESKTOP_561_DEFAULT]) + openQmakeProject(pathCreator, [Targets.DESKTOP_5_6_1_DEFAULT]) # Wait for parsing to complete startreading = datetime.utcnow() waitFor("runButton.enabled", 300000) diff --git a/tests/system/suite_general/tst_remove_kits/test.py b/tests/system/suite_general/tst_remove_kits/test.py index 98590d674a4..b5b51487417 100644 --- a/tests/system/suite_general/tst_remove_kits/test.py +++ b/tests/system/suite_general/tst_remove_kits/test.py @@ -46,7 +46,7 @@ def __removeKit__(kit, kitName): if kitName == Targets.getStringForTarget(Targets.getDefaultKit()): # The following kits will be the default kit at that time kitNameTemplate += " (default)" - item = kitNameTemplate % kitName + item = kitNameTemplate % kitName.replace(".", "\\.") waitForObjectItem(":BuildAndRun_QTreeView", item) clickItem(":BuildAndRun_QTreeView", item, 5, 5, 0, Qt.LeftButton) clickButton(waitForObject(":Remove_QPushButton")) diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py index 7aa17f2e052..ee55e9c2b47 100644 --- a/tests/system/suite_general/tst_rename_file/test.py +++ b/tests/system/suite_general/tst_rename_file/test.py @@ -28,7 +28,7 @@ source("../../shared/qtcreator.py") def main(): # prepare example project projectName = "adding" - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "qml", "referenceexamples", "adding") proFile = projectName + ".pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index 754f42bd1e0..673aae739a6 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -39,7 +39,7 @@ def main(): "Verifying window title contains created session name.") checkWelcomePage(sessionName, True) for project in projects: - openQmakeProject(project, [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(project, [Targets.DESKTOP_5_3_1_DEFAULT]) progressBarWait(20000) checkNavigator(52, "Verifying whether all projects have been opened.") openDocument("animation.Resources.animation\\.qrc./animation.basics.animators\\.qml") @@ -66,9 +66,9 @@ def main(): invokeMenuItem("File", "Exit") def prepareTestExamples(): - examples = [os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + examples = [os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "animation", "animation.pro"), - os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "keyinteraction", "keyinteraction.pro") ] projects = [] diff --git a/tests/system/suite_qtquick/tst_qml_outline/test.py b/tests/system/suite_qtquick/tst_qml_outline/test.py index 383d8296f73..f3ca4885ac1 100644 --- a/tests/system/suite_qtquick/tst_qml_outline/test.py +++ b/tests/system/suite_qtquick/tst_qml_outline/test.py @@ -30,7 +30,7 @@ outline = ":Qt Creator_QmlJSEditor::Internal::QmlJSOutlineTreeView" treebase = "keyinteraction.Resources.keyinteraction\\.qrc./keyinteraction.focus." def main(): - sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_561_DEFAULT), + sourceExample = os.path.join(Qt5Path.examplesPath(Targets.DESKTOP_5_6_1_DEFAULT), "quick", "keyinteraction") proFile = "keyinteraction.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): @@ -39,7 +39,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - openQmakeProject(os.path.join(templateDir, proFile), [Targets.DESKTOP_531_DEFAULT]) + openQmakeProject(os.path.join(templateDir, proFile), [Targets.DESKTOP_5_3_1_DEFAULT]) qmlFiles = [treebase + "focus\\.qml", treebase + "Core.ListMenu\\.qml"] checkOutlineFor(qmlFiles) testModify() diff --git a/tests/system/suite_qtquick/tst_qtquick_creation/test.py b/tests/system/suite_qtquick/tst_qtquick_creation/test.py index 2b767cde896..0487240ecb7 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation/test.py @@ -33,7 +33,7 @@ def main(): available = [("5.6", False), ("5.6", True)] for qtVersion, controls in available: - targ = [Targets.DESKTOP_561_DEFAULT] + targ = [Targets.DESKTOP_5_6_1_DEFAULT] quick = "2.6" # using a temporary directory won't mess up a potentially existing workingDir = tempDir() diff --git a/tests/system/suite_qtquick/tst_qtquick_creation3/test.py b/tests/system/suite_qtquick/tst_qtquick_creation3/test.py index 507abffba38..b47da5d58d7 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation3/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation3/test.py @@ -35,8 +35,8 @@ def main(): # using a temporary directory won't mess up a potentially existing workingDir = tempDir() projectName = createNewQtQuickUI(workingDir, qtVersion) - kit = Targets.getStringForTarget(Targets.DESKTOP_561_DEFAULT) - if addAndActivateKit(Targets.DESKTOP_561_DEFAULT): + kit = Targets.getStringForTarget(Targets.DESKTOP_5_6_1_DEFAULT) + if addAndActivateKit(Targets.DESKTOP_5_6_1_DEFAULT): quick = "2.6" else: test.fatal("Failed to activate kit %s" % kit) diff --git a/tests/system/suite_qtquick/tst_qtquick_creation4/test.py b/tests/system/suite_qtquick/tst_qtquick_creation4/test.py index 3fc99ae0bfa..a39ac6f8670 100644 --- a/tests/system/suite_qtquick/tst_qtquick_creation4/test.py +++ b/tests/system/suite_qtquick/tst_qtquick_creation4/test.py @@ -29,7 +29,7 @@ def main(): startApplication("qtcreator" + SettingsPath) if not startedWithoutPluginError(): return - for target in [Targets.DESKTOP_561_DEFAULT, Targets.DESKTOP_531_DEFAULT]: + for target in [Targets.DESKTOP_5_6_1_DEFAULT, Targets.DESKTOP_5_3_1_DEFAULT]: # using a temporary directory won't mess up a potentially existing createNewQmlExtension(tempDir(), [target]) # wait for parsing to complete From 4db7fd064f747ef115da15f8800ae3b57d4e1ca1 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 12:45:56 +0100 Subject: [PATCH 22/43] TextEditor: Avoid running hover handlers for same request ...in case the current run is not yet finished. Change-Id: Id78db576ad8fad10af6b21c73e5b47b49d58d26b Reviewed-by: Ivan Donchevskii --- src/plugins/texteditor/texteditor.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 2e5aa9dd5f6..a0cbd176999 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -313,6 +313,9 @@ public: return; } + if (isCheckRunning(documentRevision, position)) + return; + // Cancel currently running checks for (BaseHoverHandler *handler : m_handlers) handler->abort(); @@ -331,6 +334,13 @@ public: checkNext(); } + bool isCheckRunning(int documentRevision, int position) const + { + return m_currentHandlerIndex <= m_handlers.size() + && m_documentRevision == documentRevision + && m_position == position; + } + void checkNext() { QTC_ASSERT(m_currentHandlerIndex < m_handlers.size(), return); From 608e7ec2459e3ce30a51fd9b58cd93a0e5384973 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 18 Jan 2018 16:04:27 +0100 Subject: [PATCH 23/43] Clang: Fix tooltips for constructors Constructors were not handled yet, so the tooltip for e.g. the "QString()" constructor was "void ()". Also, since the help system has problems with overloads, show the function signature as clang sees it and provide a help system query that will show the documentation for the class instead of the wrong overload. Change-Id: Idc0cf9dce6a50c323e6fd945f277c7816b0f9b34 Reviewed-by: Ivan Donchevskii --- .../source/clangtooltipinfocollector.cpp | 10 ++++- tests/unit/unittest/clangtooltipinfo-test.cpp | 42 +++++++++++++++++++ tests/unit/unittest/data/tooltipinfo.cpp | 16 +++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp index 44dde1edbbc..c9b70350a41 100644 --- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp +++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp @@ -237,7 +237,7 @@ Utf8String ToolTipInfoCollector::text(const Cursor &cursor, const Cursor &refere if (referenced.isAnyTypeAlias()) return textForAnyTypeAlias(referenced); - if (referenced.isFunctionLike()) + if (referenced.isFunctionLike() || referenced.kind() == CXCursor_Constructor) return textForFunctionLike(referenced); if (referenced.type().canonical().isBuiltinType()) @@ -412,6 +412,14 @@ ToolTipInfo ToolTipInfoCollector::qDocInfo(const Cursor &cursor) const if (isBuiltinOrPointerToBuiltin(cursor.type())) return result; + if (cursor.kind() == CXCursor_Constructor) { + const ToolTipInfo parentInfo = qDocInfo(cursor.semanticParent()); + result.setQdocIdCandidates(parentInfo.qdocIdCandidates()); + result.setQdocMark(parentInfo.qdocMark()); + result.setQdocCategory(ToolTipInfo::Unknown); + return result; + } + result.setQdocIdCandidates(qDocIdCandidates(cursor)); result.setQdocMark(qdocMark(cursor)); result.setQdocCategory(qdocCategory(cursor)); diff --git a/tests/unit/unittest/clangtooltipinfo-test.cpp b/tests/unit/unittest/clangtooltipinfo-test.cpp index acaa3e18d73..c796932092a 100644 --- a/tests/unit/unittest/clangtooltipinfo-test.cpp +++ b/tests/unit/unittest/clangtooltipinfo-test.cpp @@ -614,6 +614,48 @@ TEST_F(ToolTipInfo, AutoTypeClassTemplateType) ASSERT_THAT(actual.text(), Utf8StringLiteral("Zii")); } +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_DefaultConstructor)) +{ + const ::ToolTipInfo actual = tooltip(193, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("inline constexpr Con::Con() noexcept")); +} + +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_ExplicitDefaultConstructor)) +{ + const ::ToolTipInfo actual = tooltip(194, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("ExplicitCon::ExplicitCon() noexcept = default")); +} + +TEST_F(ToolTipInfo, DISABLED_WITHOUT_PRETTYDECL_PATCH(Function_CustomConstructor)) +{ + const ::ToolTipInfo actual = tooltip(195, 5); + + ASSERT_THAT(actual.text(), Utf8StringLiteral("ExplicitCon::ExplicitCon(int m)")); +} + +// Overloads are problematic for the help system since the data base has not +// enough information about them. At least for constructors we can improve +// the situation a bit - provide a help system query that: +// 1) will not lead to the replacement of the constructor signature as +// clang sees it with the wrong overload documentation +// (signature + main help sentence). That's the qdocCategory=Unknown +// part. +// 2) finds the documentation for the class instead of the overload, +// so F1 will go to the class documentation. +TEST_F(ToolTipInfo, Function_ConstructorQDoc) +{ + ::ToolTipInfo expected; + expected.setQdocIdCandidates({Utf8StringLiteral("Con")}); + expected.setQdocMark(Utf8StringLiteral("Con")); + expected.setQdocCategory(::ToolTipInfo::Unknown); + + const ::ToolTipInfo actual = tooltip(193, 5); + + ASSERT_THAT(actual, IsQdocToolTip(expected)); +} + std::unique_ptr ToolTipInfo::d; void ToolTipInfo::SetUpTestCase() diff --git a/tests/unit/unittest/data/tooltipinfo.cpp b/tests/unit/unittest/data/tooltipinfo.cpp index 1945577b635..266d86bc47c 100644 --- a/tests/unit/unittest/data/tooltipinfo.cpp +++ b/tests/unit/unittest/data/tooltipinfo.cpp @@ -178,3 +178,19 @@ void autoTypes() auto c = Bar(); (void)c; auto d = Zii(); (void)d; } + + + + +struct Con {}; +struct ExplicitCon { + ExplicitCon() = default; + ExplicitCon(int m) :member(m) {} + int member; +}; +void constructor() +{ + Con(); + ExplicitCon(); + ExplicitCon(2); +} From b344d7f0b8c8445a02ace19fbdd83e27d244ca87 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 17 Jan 2018 15:02:28 +0100 Subject: [PATCH 24/43] Doc: Mention tooltips as ported to clang code model Change-Id: I6f8de3dae10e07f52709353f6d45b63f461cba24 Reviewed-by: David Schulz Reviewed-by: Leena Miettinen --- doc/src/editors/creator-clang-codemodel.qdoc | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/editors/creator-clang-codemodel.qdoc b/doc/src/editors/creator-clang-codemodel.qdoc index 4b29842e966..c3e52e6a9b2 100644 --- a/doc/src/editors/creator-clang-codemodel.qdoc +++ b/doc/src/editors/creator-clang-codemodel.qdoc @@ -93,6 +93,7 @@ \li Code completion \li Syntactic and semantic highlighting \li Diagnostics + \li Tooltips \endlist From e8d7a1f21eaead61459f2970e59178099da6f8ff Mon Sep 17 00:00:00 2001 From: Christian Gagneraud Date: Sun, 1 Oct 2017 18:41:31 +1300 Subject: [PATCH 25/43] sdktool: Update README and convert it to markdown Change-Id: I4ea36841e51138c4feed85d8146a07f8824ee853 Reviewed-by: Leena Miettinen Reviewed-by: Tobias Hunger Reviewed-by: Orgad Shaneh --- src/tools/sdktool/README.md | 208 ++++++++++++++++++++++++------------ 1 file changed, 139 insertions(+), 69 deletions(-) diff --git a/src/tools/sdktool/README.md b/src/tools/sdktool/README.md index a8e9a75f6d3..764fee53427 100644 --- a/src/tools/sdktool/README.md +++ b/src/tools/sdktool/README.md @@ -1,4 +1,4 @@ -The SDK tool can be used to set up Qt versions, tool chains and kits +The SDK tool can be used to set up Qt versions, tool chains, devices and kits in Qt Creator. There still is a lot of knowledge about Qt Creator internals required @@ -6,18 +6,23 @@ to use this tool! Note that some tool chains/Qt versions/kits may require settings not available via command line switches. All operations will add any parameter -followed by another parameter in the form ":" to the +followed by another parameter in the form `:` to the configuration that they create. Currently supported types are int, bool, QString, QByteArray and QVariantList. Dependencies: -The SDK tool depends on the Utils library of Qt Creator and Qt itself. -Please make sure both libraries are found by setting PATH/LD_LIBRARY_PATH. +============= + +The SDK tool depends only on Qt core library. Usage: +====== + +``` +./sdktool --help Qt Creator SDK setup tool. - Usage:./sdktool + Usage: sdktool ARGS: --help|-h Print this help text @@ -26,109 +31,174 @@ ARGS: OPERATION: One of: addKeys add settings to Qt Creator configuration - addKit add a Kit to Qt Creator + addCMake add a CMake tool to Qt Creator + addDebugger add a debugger to Qt Creator + addDev add a device to Qt Creator addQt add a Qt version to Qt Creator addTC add a tool chain to Qt Creator - findKey find a key in the settings of Qt Creator - find find a value in the settings of Qt Creator + addKit add a kit to Qt Creator get get settings from Qt Creator configuration + rmCMake remove a CMake tool from Qt Creator + rmKit remove a kit from Qt Creator + rmDebugger remove a debugger from Qt Creator + rmDev remove a device from Qt Creator rmKeys remove settings from Qt Creator configuration - rmKit remove a Kit from Qt Creator rmQt remove a Qt version from Qt Creator rmTC remove a tool chain from Qt Creator + findKey find a key in the settings of Qt Creator + find find a value in the settings of Qt Creator OPERATION_ARGS: use "--help " to get help on the arguments required for an operation. - - -Help for individual operations can be retrieved using - - ./sdktool --help addKit - -Examples: +``` Add a tool chain: +================ + +``` ./sdktool addTC \ - --id "ProjectExplorer.ToolChain.Gcc:my_test_TC" \ - --name "Test TC" \ - --path /usr/bin/g++ \ + --id "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.g++" \ + --language 2 + --name "GCC (C++, x86_64)" \ + --path /home/code/build/gcc-6.3/usr/bin/g++ \ --abi x86-linux-generic-elf-64bit \ --supportedAbis x86-linux-generic-elf-64bit,x86-linux-generic-elf-32bit \ ADDITIONAL_INTEGER_PARAMETER int:42 \ ADDITIONAL_STRING_PARAMETER "QString:some string" \ +``` Tricky parts: - - The id has to be in the form "ToolChainType:some_unique_part", where the - tool chain type must be one of (as of Qt Creator 2.6): - * ProjectExplorer.ToolChain.Msvc for Microsoft MSVC compilers + - language is one of: + * C + * Cxx + - `id` has to be in the form `ToolChainType:some_unique_part`, where the + tool chain type can be one of the following, or other toolchains that plugins provide: + * `ProjectExplorer.ToolChain.Msvc` for Microsoft MSVC compilers (Note: This one will be autodetected anyway, so there is little need to add it from the sdktool) - * ProjectExplorer.ToolChain.WinCE for Windows CE tool chain by - Microsoft (Note: This one will be autodetected anyway, so there - is little need to add it from the sdktool) - * ProjectExplorer.ToolChain.Gcc for a normal GCC (linux/mac) - * Qt4ProjectManager.ToolChain.Android for the Android tool chain - * ProjectExplorer.ToolChain.Clang for the Clang compiler - * ProjectExplorer.ToolChain.LinuxIcc for the LinuxICC compiler - * ProjectExplorer.ToolChain.Mingw for the Mingw compiler + * `ProjectExplorer.ToolChain.Gcc` for a normal GCC (linux/mac) + * `ProjectExplorer.ToolChain.Clang` for the Clang compiler + * `ProjectExplorer.ToolChain.LinuxIcc` for the LinuxICC compiler + * `ProjectExplorer.ToolChain.Mingw` for the Mingw compiler + * `ProjectExplorer.ToolChain.ClangCl` for the Clang/CL compiler + * `ProjectExplorer.ToolChain.Custom` for custom toolchain + * `Qt4ProjectManager.ToolChain.Android` for the Android tool chain + * `Qnx.QccToolChain` for the Qnx QCC tool chain - Check the classes derived from ProjectExplorer::ToolChain for their + Check the classes derived from `ProjectExplorer::ToolChain` for their Ids. - The some_unique_part can be anything. Creator uses GUIDs by default, + The `some_unique_part` can be anything. Qt Creator uses GUIDs by default, but any string is fine for the SDK to use. - - The ABI needs to be in a format that ProjectExplorer::Abi::fromString(...) + - `abi` needs to be in a format that `ProjectExplorer::Abi::fromString(...)` can parse. -Add a Qt version: -./sdktool addQt \ - --id "my_test_Qt" \ - --name "Test Qt" \ - --qmake /home/code/build/qt4-4/bin/qmake \ - --type Qt4ProjectManager.QtVersion.Desktop \ +Add a debugger: +=============== + + +``` +./sdktool addDebugger \ + --id "company.product.toolchain.gdb" \ + --name "GDB (company, product)" \ + --engine 1 \ + --binary /home/code/build/gdb-7.12/bin/gdb \ + --abis arm-linux-generic-elf-32 \ +``` Tricky parts: - - The id can be any unique string. In creator this is set as the autodetection + - `id` can be any unique string. In Qt Creator this is set as the autodetection + source of the Qt version. + TODO: is it use in any special way? + + - `engine` is the integer used in the enum `Debugger::DebuggerEngineType` + + Currently these are (Qt Creator 4.6): + * 1 for gdb + * 4 for cdb + * 8 for pdb + * 256 for lldb + + - `binary` can be a absolute path, the value `auto` or an ABI. + This is used to find the appropriate debugger for MSVC toolchains + where Creator does not know the binary path itself. + +Add a Qt version: +================= + +``` +./sdktool addQt \ + --id "company.product.qt" \ + --name "Custom Qt" \ + --qmake /home/code/build/qt-5.9/bin/qmake \ + --type Qt4ProjectManager.QtVersion.Desktop \ +``` + +Tricky parts: + - `id` can be any unique string. In Qt Creator this is set as the autodetection source of the Qt version. - - type must be the string returned by BaseQtVersion::type(). + - `type` must be the string returned by `BaseQtVersion::type()`. - Currently these are (Qt Creator 2.6): - * Qt4ProjectManager.QtVersion.Android for Android - * Qt4ProjectManager.QtVersion.Desktop for a desktop Qt - * RemoteLinux.EmbeddedLinuxQt for an embedded linux Qt - * Qt4ProjectManager.QtVersion.Maemo for an Maemo Qt - * Qt4ProjectManager.QtVersion.QNX.QNX for Qt on QNX - * Qt4ProjectManager.QtVersion.Simulator for Qt running in the Qt simulator - * Qt4ProjectManager.QtVersion.WinCE for Qt on WinCE + Currently these are (Qt Creator 4.6): + * `Qt4ProjectManager.QtVersion.Android` for Android + * `Qt4ProjectManager.QtVersion.Desktop` for a desktop Qt + * `Qt4ProjectManager.QtVersion.Ios` for iOS + * `Qt4ProjectManager.QtVersion.QNX.QNX` for QNX + * `RemoteLinux.EmbeddedLinuxQt` for Embedded Linux + * `WinRt.QtVersion.WindowsRuntime` for Windows RT + * `WinRt.QtVersion.WindowsPhone` for Windows RT phone -Add a Kit using the newly set up tool chain and Qt version: +Add a kit: +========== + +Using the newly set up tool chain and Qt version: + +``` ./sdktool addKit \ - --id "my_test_kit" \ - --name "Test Kit" \ - --debuggerengine 1 \ - --debugger /tmp/gdb-test \ - --devicetype Desktop \ + --id "company.product.kit" \ + --name "Qt %{Qt:Version} (company, product)" \ + --debuggerid "company.product.toolchain.gdb" \ + --devicetype GenericLinuxOsType \ --sysroot /tmp/sysroot \ - --toolchain "ProjectExplorer.ToolChain.Gcc:my_test_TC" \ - --qt "my_test_Qt" \ - --mkspec "testspec" \ + --Ctoolchain "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.gcc" \ + --Cxxtoolchain "ProjectExplorer.ToolChain.Gcc:company.product.toolchain.g++" \ + --qt "company.product.qt" \ + --mkspec "devices/linux-mipsel-broadcom-97425-g++" \ +``` Tricky parts: - - debuggerengine is the integer used in the enum Debugger::DebuggerEngineType - The most important type is 1 for GDB. - - debugger can be a absolute path or the value: 'auto' + - `devicetype` is the string returned IDevice::type() - - devicetype is the string returned IDevice::type() + Currently these are (Qt Creator 4.6): + * `Android.Device.Type` for Android devices + * `Desktop` for code running on the local desktop + * `Ios.Device.Type` for an iOS device + * `Ios.Simulator.Type` for an iOS simulator + * `GenericLinuxOsType` for an embedded Linux device + * `WinRt.Device.Local` for Windows RT (local) + * `WinRt.Device.Emulator` for a Windows RT emulator + * `WinRt.Device.Phone` for a Windows RT phone - Currently these are (Qt Creator 2.6): - * Android.Device.Type for Android devices - * Desktop for code running on the local desktop - * HarmattanOsType for N9/N950 devices based on Harmattan - * Maemo5OsType for N900 devices based on Maemo + - `debuggerid` is one of the ids used when setting up toolchains with + `sdktool addDebugger`. - - toolchain is one of the ids used when setting up toolchains with sdktool addTC. + - `toolchain` is one of the ids used when setting up toolchains with + `sdktool addTC`. - - qt is one of the ids used when setting up Qt versions with sdktool addQt. + - `` is one of (options can be extended by plugins): + * C, Cxx, Nim + - `qt` is one of the ids used when setting up Qt versions with `sdktool addQt`. + + +Add a device: +============= + +TODO + +Add a CMake: +============ + +TODO From 3e81fe628a5e7787ef015616754b2f3a79bceb41 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 22 Jan 2018 12:23:09 +0100 Subject: [PATCH 26/43] QmlJSEditor: Avoid detaching of containers Change-Id: I52bb5b073793c11cf157cb72244ba3552ca1ac72 Reviewed-by: David Schulz Reviewed-by: Marco Benelli --- src/plugins/qmljseditor/qmljseditordocument.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditordocument.cpp b/src/plugins/qmljseditor/qmljseditordocument.cpp index 79c348ecc4d..66fa6da393e 100644 --- a/src/plugins/qmljseditor/qmljseditordocument.cpp +++ b/src/plugins/qmljseditor/qmljseditordocument.cpp @@ -43,6 +43,8 @@ #include #include +#include + using namespace QmlJSEditor; using namespace QmlJS; using namespace QmlJS::AST; @@ -625,13 +627,13 @@ void QmlJSEditorDocumentPrivate::createTextMarks(const SemanticInfo &info) m_semanticMarks.removeAll(mark); delete mark; }; - for (const DiagnosticMessage &diagnostic : info.semanticMessages) { + for (const DiagnosticMessage &diagnostic : Utils::asConst(info.semanticMessages)) { auto mark = new QmlJSTextMark(q->filePath().toString(), diagnostic, onMarkRemoved); m_semanticMarks.append(mark); q->addMark(mark); } - for (const QmlJS::StaticAnalysis::Message &message : info.staticAnalysisMessages) { + for (const QmlJS::StaticAnalysis::Message &message : Utils::asConst(info.staticAnalysisMessages)) { auto mark = new QmlJSTextMark(q->filePath().toString(), message, onMarkRemoved); m_semanticMarks.append(mark); From 58f457f40584b562ceda6e6f62c04b943a544f0b Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 22 Jan 2018 12:41:49 +0100 Subject: [PATCH 27/43] Debugger: Also extract Qt namespaces for libinfixed Qt build GDB-only for now. Task-number: QTCREATORBUG-19620 Change-Id: I2ca3a927623ec0df742fed65048e8a3bcfa5cee2 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/gdbbridge.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 0425641c6df..320695a7507 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -31,6 +31,7 @@ except: import gdb import os import os.path +import re import sys import struct import tempfile @@ -995,15 +996,11 @@ class Dumper(DumperBase): def handleNewObjectFile(self, objfile): name = objfile.filename if self.isWindowsTarget(): - isQtCoreObjFile = name.find('Qt5Cored.dll') >= 0 or name.find('Qt5Core.dll') >= 0 - if not isQtCoreObjFile: - isQtCoreObjFile = name.find('QtCored.dll') >= 0 or name.find('QtCore.dll') >= 0 + qtCoreMatch = re.match('.*Qt5?Core[^/.]*d?\.dll', name) else: - isQtCoreObjFile = name.find('/libQt5Core') >= 0 - if not isQtCoreObjFile: - isQtCoreObjFile = name.find('/libQtCore') >= 0 + qtCoreMatch = re.match('.*/libQt5?Core[^/.]\.so', name) - if isQtCoreObjFile: + if qtCoreMatch is not None: self.handleQtCoreLoaded(objfile) def handleQtCoreLoaded(self, objfile): From 045cb7a5094de546bfbdd5533cefb8372998e58b Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 22 Jan 2018 14:48:22 +0100 Subject: [PATCH 28/43] Debugger: Clarify the accepted kit values on the command line Change-Id: If88192085d5f0d99a7017d096acbf486660c4358 Reviewed-by: Leena Miettinen --- doc/src/howto/creator-cli.qdoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/src/howto/creator-cli.qdoc b/doc/src/howto/creator-cli.qdoc index c64d6936879..8cfb2b7dc5f 100644 --- a/doc/src/howto/creator-cli.qdoc +++ b/doc/src/howto/creator-cli.qdoc @@ -174,8 +174,8 @@ \li -debug [,kit=] \li Debugger plugin: launch and debug the executable with the name \c{executable}. - A \c{kit} can be specified to point to non-default debuggers - and sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -debug [executable,]core=[,kit=] @@ -186,8 +186,8 @@ it from the core file itself. This will fail for paths with more than about 80 characters. In such cases the \c{executable} parameter is mandatory. - A \c{kit} can be specified to point to non-default debuggers - and sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -debug ,server=[,kit=] @@ -195,8 +195,8 @@ \c{port} on the server \c{server}. The parameter \c{executable} specifies a local copy of the executable the remote debug server is manipulating. - A \c{kit} can be specified to point to non-default debuggers and - sysroots. + A \c{kit} can be specified by ID or name to point to non-default + debuggers and sysroots. \row \li -wincrashevent From 30c95c937b8b25ee828eedf449327aab0f35bded Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Wed, 10 Jan 2018 14:54:45 +0100 Subject: [PATCH 29/43] Clang: Take over jobs if document gets new project part We could loose jobs if e.g. the user switched to another parse context or shuffled project files between targets/products/project-parts while there were still jobs in the queue. Previously, changing the project part id of a document was a two step process: 1) Unregister document with old project part id 2) Register document with new project part id On 1), we have thrown the document processors (and thus the job queue) away. On 2), we have created a new document. Due to this separation the backend could not take over jobs to the new document (processor) - it could not know that these commands belong together. Now, we avoid the explicit unregister command. On a register command the backend has enough context to find out what to do, it can take over relevant jobs. Task-number: QTCREATORBUG-18856 Change-Id: Ib68a8e62140fcfdb2de58dcd2ae955b4c2e15166 Reviewed-by: Ivan Donchevskii --- .../clangeditordocumentprocessor.cpp | 1 - .../source/clangcodemodelserver.cpp | 82 +++++++++++++++---- .../source/clangcodemodelserver.h | 11 +++ .../source/clangdocumentprocessors.cpp | 22 +++-- .../unittest/clangcodemodelserver-test.cpp | 28 +++++++ 5 files changed, 122 insertions(+), 22 deletions(-) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index c7294d57c66..cf0ca4b80d1 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -435,7 +435,6 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor(CppTools::Pr if (m_projectPart) { if (projectPart->id() == m_projectPart->id()) return; - unregisterTranslationUnitForEditor(); } m_communicator.registerTranslationUnitsForEditor( diff --git a/src/tools/clangbackend/source/clangcodemodelserver.cpp b/src/tools/clangbackend/source/clangcodemodelserver.cpp index 7e004e17d03..185f0f80966 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/source/clangcodemodelserver.cpp @@ -84,21 +84,36 @@ void ClangCodeModelServer::end() QCoreApplication::exit(); } +static std::vector operator+(const std::vector &a, + const std::vector &b) +{ + std::vector result = a; + result.insert(result.end(), b.begin(), b.end()); + return result; +} + +// TODO: Rename to createOrUpdate... void ClangCodeModelServer::registerTranslationUnitsForEditor(const ClangBackEnd::RegisterTranslationUnitForEditorMessage &message) { qCDebug(serverLog) << "########## registerTranslationUnitsForEditor"; TIME_SCOPE_DURATION("ClangCodeModelServer::registerTranslationUnitsForEditor"); try { - auto createdDocuments = documents.create(message.fileContainers()); + DocumentResetInfos toReset; + QVector toCreate; + categorizeFileContainers(message.fileContainers(), toCreate, toReset); + + const std::vector createdDocuments = documents.create(toCreate); for (const auto &document : createdDocuments) documentProcessors().create(document); + const std::vector resetDocuments_ = resetDocuments(toReset); + unsavedFiles.createOrUpdate(message.fileContainers()); documents.setUsedByCurrentEditor(message.currentEditorFilePath()); documents.setVisibleInEditors(message.visibleEditorFilePaths()); - processSuspendResumeJobs(documents.documents()); - processInitialJobsForDocuments(createdDocuments); + processSuspendResumeJobs(documents.documents()); + processInitialJobsForDocuments(createdDocuments + resetDocuments_); } catch (const std::exception &exception) { qWarning() << "Error in ClangCodeModelServer::registerTranslationUnitsForEditor:" << exception.what(); } @@ -147,6 +162,14 @@ void ClangCodeModelServer::unregisterTranslationUnitsForEditor(const ClangBackEn } } +static DocumentResetInfos toDocumentResetInfos(const std::vector &documents) +{ + DocumentResetInfos infos; + for (const auto &d : documents) + infos.push_back(DocumentResetInfo{d, d.fileContainer()}); + return infos; +} + void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPartsForEditorMessage &message) { qCDebug(serverLog) << "########## registerProjectPartsForEditor"; @@ -156,19 +179,7 @@ void ClangCodeModelServer::registerProjectPartsForEditor(const RegisterProjectPa projects.createOrUpdate(message.projectContainers()); std::vector affectedDocuments = documents.setDocumentsDirtyIfProjectPartChanged(); - for (Document &document : affectedDocuments) { - documents.remove({document.fileContainer()}); - - Document newDocument = *documents.create({document.fileContainer()}).begin(); - newDocument.setDirtyIfDependencyIsMet(document.filePath()); - newDocument.setIsUsedByCurrentEditor(document.isUsedByCurrentEditor()); - newDocument.setIsVisibleInEditor(document.isVisibleInEditor(), document.visibleTimePoint()); - newDocument.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); - - documentProcessors().reset(document, newDocument); - - QTC_CHECK(document.useCount() == 1); - } + resetDocuments(toDocumentResetInfos(affectedDocuments)); processJobsForDirtyAndVisibleDocuments(); } catch (const std::exception &exception) { @@ -419,6 +430,45 @@ void ClangCodeModelServer::processSuspendResumeJobs(const std::vector } } +void ClangCodeModelServer::categorizeFileContainers(const QVector &fileContainers, + QVector &toCreate, + DocumentResetInfos &toReset) const +{ + for (const FileContainer &fileContainer : fileContainers) { + const std::vector matching = documents.filtered([&](const Document &document) { + return document.filePath() == fileContainer.filePath(); + }); + if (matching.empty()) + toCreate.push_back(fileContainer); + else + toReset.push_back(DocumentResetInfo{*matching.begin(), fileContainer}); + } +} + +std::vector ClangCodeModelServer::resetDocuments(const DocumentResetInfos &infos) +{ + std::vector newDocuments; + + for (const DocumentResetInfo &info : infos) { + const Document &document = info.documentToRemove; + QTC_CHECK(document.filePath() == info.fileContainer.filePath()); + + documents.remove({document.fileContainer()}); + + Document newDocument = *documents.create({info.fileContainer}).begin(); + newDocument.setDirtyIfDependencyIsMet(document.filePath()); + newDocument.setIsUsedByCurrentEditor(document.isUsedByCurrentEditor()); + newDocument.setIsVisibleInEditor(document.isVisibleInEditor(), document.visibleTimePoint()); + newDocument.setResponsivenessIncreaseNeeded(document.isResponsivenessIncreased()); + + documentProcessors().reset(document, newDocument); + + newDocuments.push_back(newDocument); + } + + return newDocuments; +} + void ClangCodeModelServer::processInitialJobsForDocuments(const std::vector &documents) { for (const auto &document : documents) { diff --git a/src/tools/clangbackend/source/clangcodemodelserver.h b/src/tools/clangbackend/source/clangcodemodelserver.h index 98508f348c5..ee4ecd4847f 100644 --- a/src/tools/clangbackend/source/clangcodemodelserver.h +++ b/src/tools/clangbackend/source/clangcodemodelserver.h @@ -42,6 +42,12 @@ namespace ClangBackEnd { +struct DocumentResetInfo { + Document documentToRemove; + FileContainer fileContainer; +}; +using DocumentResetInfos = QVector; + class ClangCodeModelServer : public ClangCodeModelServerInterface, public IpcClientProvider { @@ -79,6 +85,11 @@ private: void processTimerForVisibleButNotCurrentDocuments(); void processSuspendResumeJobs(const std::vector &documents); + void categorizeFileContainers(const QVector &fileContainers, + QVector &toCreate, + DocumentResetInfos &toReset) const; + std::vector resetDocuments(const DocumentResetInfos &infos); + void addAndRunUpdateJobs(std::vector documents); private: diff --git a/src/tools/clangbackend/source/clangdocumentprocessors.cpp b/src/tools/clangbackend/source/clangdocumentprocessors.cpp index ef17dddee0e..8e5a51d0051 100644 --- a/src/tools/clangbackend/source/clangdocumentprocessors.cpp +++ b/src/tools/clangbackend/source/clangdocumentprocessors.cpp @@ -86,22 +86,34 @@ void DocumentProcessors::remove(const Document &document) throw DocumentProcessorDoesNotExist(document.filePath(), document.projectPart().id()); } +static JobRequests jobsToTakeOver(const JobRequests &jobsStillInQueue, + const Utf8String &updatedProjectPartId) +{ + JobRequests jobs = Utils::filtered(jobsStillInQueue, [](const JobRequest &job) { + return job.isTakeOverable(); + }); + + for (JobRequest &job : jobs) + job.projectPartId = updatedProjectPartId; + + return jobs; +} + void DocumentProcessors::reset(const Document &oldDocument, const Document &newDocument) { // Wait until the currently running jobs finish and remember the not yet // processed job requests for the new processor... - JobRequests jobsToTakeOver = processor(oldDocument).stop(); + const JobRequests jobsStillInQueue = processor(oldDocument).stop(); // ...but do not take over irrelevant ones. - jobsToTakeOver = Utils::filtered(jobsToTakeOver, [](const JobRequest &job){ - return job.isTakeOverable(); - }); + const JobRequests jobsForNewProcessor = jobsToTakeOver(jobsStillInQueue, + newDocument.projectPart().id()); // Remove current processor remove(oldDocument); // Create new processor and take over not yet processed jobs. DocumentProcessor newProcessor = create(newDocument); - for (const JobRequest &job : jobsToTakeOver) + for (const JobRequest &job : jobsForNewProcessor) newProcessor.addJob(job); } diff --git a/tests/unit/unittest/clangcodemodelserver-test.cpp b/tests/unit/unittest/clangcodemodelserver-test.cpp index edcbcff7ade..df4afa8004b 100644 --- a/tests/unit/unittest/clangcodemodelserver-test.cpp +++ b/tests/unit/unittest/clangcodemodelserver-test.cpp @@ -102,6 +102,7 @@ protected: bool waitUntilAllJobsFinished(int timeOutInMs = 10000); void registerProjectPart(); + void registerProjectPart(const Utf8String &projectPartId); void changeProjectPartArguments(); void registerProjectAndFile(const Utf8String &filePath, @@ -111,6 +112,8 @@ protected: void registerProjectAndFilesAndWaitForFinished(int expectedDocumentAnnotationsChangedMessages = 2); void registerFile(const Utf8String &filePath, int expectedDocumentAnnotationsChangedMessages = 1); + void registerFile(const Utf8String &filePath, const Utf8String &projectPartId, + int expectedDocumentAnnotationsChangedMessages = 1); void registerFiles(int expectedDocumentAnnotationsChangedMessages); void registerFileWithUnsavedContent(const Utf8String &filePath, const Utf8String &content); @@ -155,6 +158,7 @@ protected: ClangBackEnd::ClangCodeModelServer clangServer; const ClangBackEnd::Documents &documents = clangServer.documentsForTestOnly(); const Utf8String projectPartId = Utf8StringLiteral("pathToProjectPart.pro"); + const Utf8String projectPartId2 = Utf8StringLiteral("otherPathToProjectPart.pro"); const Utf8String filePathA = Utf8StringLiteral(TESTDATA_DIR"/complete_extractor_function.cpp"); const QString filePathAUnsavedVersion1 @@ -418,6 +422,18 @@ TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartChange) updateVisibilty(filePathC, filePathC); // Enable processing jobs } +TEST_F(ClangCodeModelServerSlowTest, TakeOverJobsOnProjectPartIdChange) +{ + registerProjectPart(projectPartId); + registerProjectPart(projectPartId2); + registerFile(filePathC, projectPartId, 0); + requestReferences(); + + expectReferences(); + + registerFile(filePathC, projectPartId2); // Here we do not want to loose the RequestReferences job +} + void ClangCodeModelServer::SetUp() { clangServer.setClient(&mockClangCodeModelClient); @@ -452,6 +468,13 @@ void ClangCodeModelServer::registerProjectAndFilesAndWaitForFinished( void ClangCodeModelServer::registerFile(const Utf8String &filePath, int expectedDocumentAnnotationsChangedMessages) +{ + registerFile(filePath, projectPartId, expectedDocumentAnnotationsChangedMessages); +} + +void ClangCodeModelServer::registerFile(const Utf8String &filePath, + const Utf8String &projectPartId, + int expectedDocumentAnnotationsChangedMessages) { const FileContainer fileContainer(filePath, projectPartId); const RegisterTranslationUnitForEditorMessage message({fileContainer}, filePath, {filePath}); @@ -683,6 +706,11 @@ void ClangCodeModelServer::unregisterFile(const Utf8String &filePath) } void ClangCodeModelServer::registerProjectPart() +{ + registerProjectPart(projectPartId); +} + +void ClangCodeModelServer::registerProjectPart(const Utf8String &projectPartId) { RegisterProjectPartsForEditorMessage message({ProjectPartContainer(projectPartId)}); From 3ea921c21604b9416f8811ba8a1edb14c5a12b23 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 19 Jan 2018 09:36:46 +0100 Subject: [PATCH 30/43] CppTools: Move some decls from header to source ...as there is no client using them. Change-Id: I2fbbe247e6f4bad537644a9574ddcc0606bfa13e Reviewed-by: Ivan Donchevskii --- src/plugins/cpptools/cppelementevaluator.cpp | 493 ++++++++++--------- src/plugins/cpptools/cppelementevaluator.h | 63 --- 2 files changed, 263 insertions(+), 293 deletions(-) diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp index 3281783ef26..df9ebefa3da 100644 --- a/src/plugins/cpptools/cppelementevaluator.cpp +++ b/src/plugins/cpptools/cppelementevaluator.cpp @@ -57,6 +57,269 @@ static QStringList stripName(const QString &name) return all; } +CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown) +{} + +CppElement::~CppElement() +{} + +class Unknown : public CppElement +{ +public: + explicit Unknown(const QString &type) : type(type) + { + tooltip = type; + } + +public: + QString type; +}; + +class CppInclude : public CppElement +{ +public: + explicit CppInclude(const Document::Include &includeFile) + : path(QDir::toNativeSeparators(includeFile.resolvedFileName())) + , fileName(Utils::FileName::fromString(includeFile.resolvedFileName()).fileName()) + { + helpCategory = TextEditor::HelpItem::Brief; + helpIdCandidates = QStringList(fileName); + helpMark = fileName; + link = Utils::Link(path); + tooltip = path; + } + +public: + QString path; + QString fileName; +}; + +class CppMacro : public CppElement +{ +public: + explicit CppMacro(const Macro ¯o) + { + helpCategory = TextEditor::HelpItem::Macro; + const QString macroName = QString::fromUtf8(macro.name(), macro.name().size()); + helpIdCandidates = QStringList(macroName); + helpMark = macroName; + link = Utils::Link(macro.fileName(), macro.line()); + tooltip = macro.toStringWithLineBreaks(); + } +}; + +// CppDeclarableElement +CppDeclarableElement::CppDeclarableElement(Symbol *declaration) + : CppElement() + , declaration(declaration) + , icon(Icons::iconForSymbol(declaration)) +{ + Overview overview; + overview.showArgumentNames = true; + overview.showReturnTypes = true; + name = overview.prettyName(declaration->name()); + if (declaration->enclosingScope()->isClass() || + declaration->enclosingScope()->isNamespace() || + declaration->enclosingScope()->isEnum()) { + qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); + helpIdCandidates = stripName(qualifiedName); + } else { + qualifiedName = name; + helpIdCandidates.append(name); + } + + tooltip = overview.prettyType(declaration->type(), qualifiedName); + link = CppTools::linkToSymbol(declaration); + helpMark = name; +} + +class CppNamespace : public CppDeclarableElement +{ +public: + explicit CppNamespace(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + tooltip = qualifiedName; + } +}; + + +CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration) +{ + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + tooltip = qualifiedName; +} + +bool CppClass::operator==(const CppClass &other) +{ + return this->declaration == other.declaration; +} + +void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) +{ + typedef QPair Data; + + if (ClassOrNamespace *clazz = context.lookupType(declaration)) { + QSet visited; + + QQueue q; + q.enqueue(qMakePair(clazz, this)); + while (!q.isEmpty()) { + Data current = q.dequeue(); + clazz = current.first; + visited.insert(clazz); + const QList &bases = clazz->usings(); + foreach (ClassOrNamespace *baseClass, bases) { + const QList &symbols = baseClass->symbols(); + foreach (Symbol *symbol, symbols) { + if (symbol->isClass() && ( + clazz = context.lookupType(symbol)) && + !visited.contains(clazz)) { + CppClass baseCppClass(symbol); + CppClass *cppClass = current.second; + cppClass->bases.append(baseCppClass); + q.enqueue(qMakePair(clazz, &cppClass->bases.last())); + } + } + } + } + } +} + +void CppClass::lookupDerived(Symbol *declaration, const Snapshot &snapshot) +{ + typedef QPair Data; + + CppTools::TypeHierarchyBuilder builder(declaration, snapshot); + const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(); + + QQueue q; + q.enqueue(qMakePair(this, completeHierarchy)); + while (!q.isEmpty()) { + const Data ¤t = q.dequeue(); + CppClass *clazz = current.first; + const CppTools::TypeHierarchy &classHierarchy = current.second; + foreach (const CppTools::TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { + clazz->derived.append(CppClass(derivedHierarchy.symbol())); + q.enqueue(qMakePair(&clazz->derived.last(), derivedHierarchy)); + } + } +} + +class CppFunction : public CppDeclarableElement +{ +public: + explicit CppFunction(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Function; + + const FullySpecifiedType &type = declaration->type(); + + // Functions marks can be found either by the main overload or signature based + // (with no argument names and no return). Help ids have no signature at all. + Overview overview; + overview.showDefaultArguments = false; + helpMark = overview.prettyType(type, name); + + overview.showFunctionSignatures = false; + helpIdCandidates.append(overview.prettyName(declaration->name())); + } +}; + +class CppEnum : public CppDeclarableElement +{ +public: + explicit CppEnum(Enum *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Enum; + tooltip = qualifiedName; + } +}; + +class CppTypedef : public CppDeclarableElement +{ +public: + explicit CppTypedef(Symbol *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Typedef; + tooltip = Overview().prettyType(declaration->type(), qualifiedName); + } +}; + +class CppVariable : public CppDeclarableElement +{ +public: + explicit CppVariable(Symbol *declaration, const LookupContext &context, Scope *scope) + : CppDeclarableElement(declaration) + { + const FullySpecifiedType &type = declaration->type(); + + const Name *typeName = 0; + if (type->isNamedType()) { + typeName = type->asNamedType()->name(); + } else if (type->isPointerType() || type->isReferenceType()) { + FullySpecifiedType associatedType; + if (type->isPointerType()) + associatedType = type->asPointerType()->elementType(); + else + associatedType = type->asReferenceType()->elementType(); + if (associatedType->isNamedType()) + typeName = associatedType->asNamedType()->name(); + } + + if (typeName) { + if (ClassOrNamespace *clazz = context.lookupType(typeName, scope)) { + if (!clazz->symbols().isEmpty()) { + Overview overview; + Symbol *symbol = clazz->symbols().at(0); + const QString &name = overview.prettyName( + LookupContext::fullyQualifiedName(symbol)); + if (!name.isEmpty()) { + tooltip = name; + helpCategory = TextEditor::HelpItem::ClassOrNamespace; + const QStringList &allNames = stripName(name); + if (!allNames.isEmpty()) { + helpMark = allNames.last(); + helpIdCandidates = allNames; + } + } + } + } + } + } +}; + +class CppEnumerator : public CppDeclarableElement +{ +public: + explicit CppEnumerator(EnumeratorDeclaration *declaration) + : CppDeclarableElement(declaration) + { + helpCategory = TextEditor::HelpItem::Enum; + + Overview overview; + + Symbol *enumSymbol = declaration->enclosingScope(); + const QString enumName = overview.prettyName(LookupContext::fullyQualifiedName(enumSymbol)); + const QString enumeratorName = overview.prettyName(declaration->name()); + QString enumeratorValue; + if (const StringLiteral *value = declaration->constantValue()) + enumeratorValue = QString::fromUtf8(value->chars(), value->size()); + + helpMark = overview.prettyName(enumSymbol->name()); + + tooltip = enumeratorName; + if (!enumName.isEmpty()) + tooltip.prepend(enumName + QLatin1Char(' ')); + if (!enumeratorValue.isEmpty()) + tooltip.append(QLatin1String(" = ") + enumeratorValue); + } +}; + CppElementEvaluator::CppElementEvaluator(TextEditor::TextEditorWidget *editor) : m_editor(editor), m_modelManager(CppTools::CppModelManager::instance()), @@ -240,234 +503,4 @@ void CppElementEvaluator::clear() m_diagnosis.clear(); } -// CppElement -CppElement::CppElement() : helpCategory(TextEditor::HelpItem::Unknown) -{} - -CppElement::~CppElement() -{} - -// Unknown -Unknown::Unknown(const QString &type) : type(type) -{ - tooltip = type; -} - - -// CppInclude - -CppInclude::CppInclude(const Document::Include &includeFile) : - path(QDir::toNativeSeparators(includeFile.resolvedFileName())), - fileName(Utils::FileName::fromString(includeFile.resolvedFileName()).fileName()) -{ - helpCategory = TextEditor::HelpItem::Brief; - helpIdCandidates = QStringList(fileName); - helpMark = fileName; - link = Utils::Link(path); - tooltip = path; -} - -// CppMacro -CppMacro::CppMacro(const Macro ¯o) -{ - helpCategory = TextEditor::HelpItem::Macro; - const QString macroName = QString::fromUtf8(macro.name(), macro.name().size()); - helpIdCandidates = QStringList(macroName); - helpMark = macroName; - link = Utils::Link(macro.fileName(), macro.line()); - tooltip = macro.toStringWithLineBreaks(); -} - -// CppDeclarableElement - -CppDeclarableElement::CppDeclarableElement(Symbol *declaration) - : CppElement() - , declaration(declaration) - , icon(Icons::iconForSymbol(declaration)) -{ - Overview overview; - overview.showArgumentNames = true; - overview.showReturnTypes = true; - name = overview.prettyName(declaration->name()); - if (declaration->enclosingScope()->isClass() || - declaration->enclosingScope()->isNamespace() || - declaration->enclosingScope()->isEnum()) { - qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration)); - helpIdCandidates = stripName(qualifiedName); - } else { - qualifiedName = name; - helpIdCandidates.append(name); - } - - tooltip = overview.prettyType(declaration->type(), qualifiedName); - link = CppTools::linkToSymbol(declaration); - helpMark = name; -} - -// CppNamespace -CppNamespace::CppNamespace(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - tooltip = qualifiedName; -} - -// CppClass -CppClass::CppClass(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - tooltip = qualifiedName; -} - -bool CppClass::operator==(const CppClass &other) -{ - return this->declaration == other.declaration; -} - -void CppClass::lookupBases(Symbol *declaration, const LookupContext &context) -{ - typedef QPair Data; - - if (ClassOrNamespace *clazz = context.lookupType(declaration)) { - QSet visited; - - QQueue q; - q.enqueue(qMakePair(clazz, this)); - while (!q.isEmpty()) { - Data current = q.dequeue(); - clazz = current.first; - visited.insert(clazz); - const QList &bases = clazz->usings(); - foreach (ClassOrNamespace *baseClass, bases) { - const QList &symbols = baseClass->symbols(); - foreach (Symbol *symbol, symbols) { - if (symbol->isClass() && ( - clazz = context.lookupType(symbol)) && - !visited.contains(clazz)) { - CppClass baseCppClass(symbol); - CppClass *cppClass = current.second; - cppClass->bases.append(baseCppClass); - q.enqueue(qMakePair(clazz, &cppClass->bases.last())); - } - } - } - } - } -} - -void CppClass::lookupDerived(Symbol *declaration, const Snapshot &snapshot) -{ - typedef QPair Data; - - CppTools::TypeHierarchyBuilder builder(declaration, snapshot); - const CppTools::TypeHierarchy &completeHierarchy = builder.buildDerivedTypeHierarchy(); - - QQueue q; - q.enqueue(qMakePair(this, completeHierarchy)); - while (!q.isEmpty()) { - const Data ¤t = q.dequeue(); - CppClass *clazz = current.first; - const CppTools::TypeHierarchy &classHierarchy = current.second; - foreach (const CppTools::TypeHierarchy &derivedHierarchy, classHierarchy.hierarchy()) { - clazz->derived.append(CppClass(derivedHierarchy.symbol())); - q.enqueue(qMakePair(&clazz->derived.last(), derivedHierarchy)); - } - } -} - -// CppFunction -CppFunction::CppFunction(Symbol *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Function; - - const FullySpecifiedType &type = declaration->type(); - - // Functions marks can be found either by the main overload or signature based - // (with no argument names and no return). Help ids have no signature at all. - Overview overview; - overview.showDefaultArguments = false; - helpMark = overview.prettyType(type, name); - - overview.showFunctionSignatures = false; - helpIdCandidates.append(overview.prettyName(declaration->name())); -} - -// CppEnum -CppEnum::CppEnum(Enum *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Enum; - tooltip = qualifiedName; -} - -// CppTypedef -CppTypedef::CppTypedef(Symbol *declaration) : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Typedef; - tooltip = Overview().prettyType(declaration->type(), qualifiedName); -} - -// CppVariable -CppVariable::CppVariable(Symbol *declaration, const LookupContext &context, Scope *scope) : - CppDeclarableElement(declaration) -{ - const FullySpecifiedType &type = declaration->type(); - - const Name *typeName = 0; - if (type->isNamedType()) { - typeName = type->asNamedType()->name(); - } else if (type->isPointerType() || type->isReferenceType()) { - FullySpecifiedType associatedType; - if (type->isPointerType()) - associatedType = type->asPointerType()->elementType(); - else - associatedType = type->asReferenceType()->elementType(); - if (associatedType->isNamedType()) - typeName = associatedType->asNamedType()->name(); - } - - if (typeName) { - if (ClassOrNamespace *clazz = context.lookupType(typeName, scope)) { - if (!clazz->symbols().isEmpty()) { - Overview overview; - Symbol *symbol = clazz->symbols().at(0); - const QString &name = - overview.prettyName(LookupContext::fullyQualifiedName(symbol)); - if (!name.isEmpty()) { - tooltip = name; - helpCategory = TextEditor::HelpItem::ClassOrNamespace; - const QStringList &allNames = stripName(name); - if (!allNames.isEmpty()) { - helpMark = allNames.last(); - helpIdCandidates = allNames; - } - } - } - } - } -} - -CppEnumerator::CppEnumerator(EnumeratorDeclaration *declaration) - : CppDeclarableElement(declaration) -{ - helpCategory = TextEditor::HelpItem::Enum; - - Overview overview; - - Symbol *enumSymbol = declaration->enclosingScope(); - const QString enumName = overview.prettyName(LookupContext::fullyQualifiedName(enumSymbol)); - const QString enumeratorName = overview.prettyName(declaration->name()); - QString enumeratorValue; - if (const StringLiteral *value = declaration->constantValue()) - enumeratorValue = QString::fromUtf8(value->chars(), value->size()); - - helpMark = overview.prettyName(enumSymbol->name()); - - tooltip = enumeratorName; - if (!enumName.isEmpty()) - tooltip.prepend(enumName + QLatin1Char(' ')); - if (!enumeratorValue.isEmpty()) - tooltip.append(QLatin1String(" = ") + enumeratorValue); -} - } // namespace CppTools diff --git a/src/plugins/cpptools/cppelementevaluator.h b/src/plugins/cpptools/cppelementevaluator.h index af994989edc..0755bd3004e 100644 --- a/src/plugins/cpptools/cppelementevaluator.h +++ b/src/plugins/cpptools/cppelementevaluator.h @@ -96,31 +96,6 @@ public: QString tooltip; }; -class Unknown : public CppElement -{ -public: - explicit Unknown(const QString &type); - -public: - QString type; -}; - -class CppInclude : public CppElement -{ -public: - explicit CppInclude(const CPlusPlus::Document::Include &includeFile); - -public: - QString path; - QString fileName; -}; - -class CppMacro : public CppElement -{ -public: - explicit CppMacro(const CPlusPlus::Macro ¯o); -}; - class CppDeclarableElement : public CppElement { public: @@ -134,12 +109,6 @@ public: QIcon icon; }; -class CppNamespace : public CppDeclarableElement -{ -public: - explicit CppNamespace(CPlusPlus::Symbol *declaration); -}; - class CppClass : public CppDeclarableElement { public: @@ -156,36 +125,4 @@ public: QList derived; }; -class CppFunction : public CppDeclarableElement -{ -public: - explicit CppFunction(CPlusPlus::Symbol *declaration); -}; - -class CppEnum : public CppDeclarableElement -{ -public: - explicit CppEnum(CPlusPlus::Enum *declaration); -}; - -class CppTypedef : public CppDeclarableElement -{ -public: - explicit CppTypedef(CPlusPlus::Symbol *declaration); -}; - -class CppVariable : public CppDeclarableElement -{ -public: - CppVariable(CPlusPlus::Symbol *declaration, - const CPlusPlus::LookupContext &context, - CPlusPlus::Scope *scope); -}; - -class CppEnumerator : public CppDeclarableElement -{ -public: - explicit CppEnumerator(CPlusPlus::EnumeratorDeclaration *declaration); -}; - } // namespace CppTools From 22b0d3b6aab5798009550e2b4d2a4e196ed36f33 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Thu, 18 Jan 2018 20:08:25 +0200 Subject: [PATCH 31/43] Debugger: Search for kit also by display name The Id is not visible to users. Allow to pass name instead (first match will be used). Change-Id: I6bcd7ce50297e373b5b4d8a553009a27ff43cd24 Reviewed-by: Christian Stenger Reviewed-by: hjk --- src/plugins/debugger/debuggerplugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index e0fa782c390..8e46a9735e3 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1133,6 +1133,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, } } else if (key == "kit") { kit = KitManager::kit(Id::fromString(val)); + if (!kit) + kit = KitManager::kit(Utils::equal(&Kit::displayName, val)); } else if (key == "server") { startMode = AttachToRemoteServer; remoteChannel = remoteChannel; From 8dae0c4613005e7c398d3c5ef65d49a584b48d7a Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 18 Jan 2018 15:49:12 +0100 Subject: [PATCH 32/43] FakeVim: Correct handling of settings Fix handling of restoring default values. If the user restores default values ensure that these changes are taken into account as well, otherwise the user would restore the old settings (instead of default settings) when restarting QC. When changing command mappings for FakeVim write the changes immediately to the settings if the user leaves the options without canceling. Change-Id: I81ee47af6a208823d4afecb71cbaddcf2d571750 Reviewed-by: hjk --- src/plugins/fakevim/fakevimplugin.cpp | 180 ++++++++++++++++---------- 1 file changed, 114 insertions(+), 66 deletions(-) diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 0ec944f92e0..d8c92a13ebb 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -548,10 +548,13 @@ private: ExCommandMap &exCommandMap(); ExCommandMap &defaultExCommandMap(); + ExCommandMap exCommandMapFromWidget(); FakeVimPluginPrivate *m_q; QGroupBox *m_commandBox; FancyLineEdit *m_commandEdit; + + friend class FakeVimExCommandsPage; // allow the page accessing the ExCommandMaps }; FakeVimExCommandsWidget::FakeVimExCommandsWidget(FakeVimPluginPrivate *q, QWidget *parent) @@ -601,12 +604,12 @@ public: } QWidget *widget() override; - void apply() override {} - void finish() override; + void apply() override; + void finish() override {} private: FakeVimPluginPrivate *m_q; - QPointer m_widget; + QPointer m_widget; }; QWidget *FakeVimExCommandsPage::widget() @@ -616,9 +619,44 @@ QWidget *FakeVimExCommandsPage::widget() return m_widget; } -void FakeVimExCommandsPage::finish() +const char exCommandMapGroup[] = "FakeVimExCommand"; +const char userCommandMapGroup[] = "FakeVimUserCommand"; +const char reKey[] = "RegEx"; +const char cmdKey[] = "Cmd"; +const char idKey[] = "Command"; + +void FakeVimExCommandsPage::apply() { - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + // now save the mappings if necessary + const ExCommandMap &newMapping = m_widget->exCommandMapFromWidget(); + ExCommandMap &globalCommandMapping = m_widget->exCommandMap(); + + if (newMapping != globalCommandMapping) { + const ExCommandMap &defaultMap = m_widget->defaultExCommandMap(); + QSettings *settings = ICore::settings(); + settings->beginWriteArray(exCommandMapGroup); + int count = 0; + typedef ExCommandMap::const_iterator Iterator; + const Iterator end = newMapping.constEnd(); + for (Iterator it = newMapping.constBegin(); it != end; ++it) { + const QString id = it.key(); + const QRegExp re = it.value(); + + if ((defaultMap.contains(id) && defaultMap[id] != re) + || (!defaultMap.contains(id) && !re.pattern().isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, id); + settings->setValue(reKey, re.pattern()); + ++count; + } + } + settings->endArray(); + globalCommandMapping.clear(); + globalCommandMapping.unite(defaultMap); + globalCommandMapping.unite(newMapping); + } } void FakeVimExCommandsWidget::initialize() @@ -658,7 +696,7 @@ void FakeVimExCommandsWidget::initialize() setModified(item, true); } - handleCurrentCommandChanged(0); + handleCurrentCommandChanged(nullptr); } void FakeVimExCommandsWidget::handleCurrentCommandChanged(QTreeWidgetItem *current) @@ -681,10 +719,8 @@ void FakeVimExCommandsWidget::commandChanged() const QString name = current->data(0, CommandRole).toString(); const QString regex = m_commandEdit->text(); - if (current->data(0, Qt::UserRole).isValid()) { + if (current->data(0, Qt::UserRole).isValid()) current->setText(2, regex); - exCommandMap()[name] = QRegExp(regex); - } setModified(current, regex != defaultExCommandMap()[name].pattern()); } @@ -734,6 +770,8 @@ public: FakeVimUserCommandsModel(FakeVimPluginPrivate *q) : m_q(q) {} ~FakeVimUserCommandsModel() {} + void initCommandMap(const UserCommandMap &commandMap) { m_commandMap = commandMap; } + UserCommandMap commandMap() const { return m_commandMap; } int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &index, int role) const; @@ -743,6 +781,7 @@ public: private: FakeVimPluginPrivate *m_q; + UserCommandMap m_commandMap; }; int FakeVimUserCommandsModel::rowCount(const QModelIndex &parent) const @@ -814,17 +853,19 @@ public: setCategoryIcon(Utils::Icon(SETTINGS_CATEGORY_FAKEVIM_ICON)); } - void apply(); - void finish() {} + void apply() override; + void finish() override {} QWidget *widget(); void initialize() {} UserCommandMap &userCommandMap(); UserCommandMap &defaultUserCommandMap(); + UserCommandMap currentCommandMap(); private: FakeVimPluginPrivate *m_q; QPointer m_widget; + FakeVimUserCommandsModel *m_model; }; QWidget *FakeVimUserCommandsPage::widget() @@ -832,10 +873,11 @@ QWidget *FakeVimUserCommandsPage::widget() if (!m_widget) { m_widget = new QWidget; - auto model = new FakeVimUserCommandsModel(m_q); + m_model = new FakeVimUserCommandsModel(m_q); + m_model->initCommandMap(userCommandMap()); auto widget = new QTreeView; - model->setParent(widget); - widget->setModel(model); + m_model->setParent(widget); + widget->setModel(m_model); widget->resizeColumnToContents(0); auto delegate = new FakeVimUserCommandsDelegate(widget); @@ -850,8 +892,37 @@ QWidget *FakeVimUserCommandsPage::widget() void FakeVimUserCommandsPage::apply() { - //m_q->writeSettings(); - delete m_widget; + if (!m_widget) // page has not been shown at all + return; + + // now save the mappings if necessary + const UserCommandMap ¤t = currentCommandMap(); + UserCommandMap &userMap = userCommandMap(); + + if (current != userMap) { + QSettings *settings = ICore::settings(); + settings->beginWriteArray(userCommandMapGroup); + int count = 0; + typedef UserCommandMap::const_iterator Iterator; + const Iterator end = current.constEnd(); + for (Iterator it = current.constBegin(); it != end; ++it) { + const int key = it.key(); + const QString cmd = it.value(); + + if ((defaultUserCommandMap().contains(key) + && defaultUserCommandMap()[key] != cmd) + || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { + settings->setArrayIndex(count); + settings->setValue(idKey, key); + settings->setValue(cmdKey, cmd); + ++count; + } + } + settings->endArray(); + userMap.clear(); + userMap.unite(defaultUserCommandMap()); + userMap.unite(current); + } } @@ -1125,7 +1196,7 @@ QVariant FakeVimUserCommandsModel::data(const QModelIndex &index, int role) cons case 0: // Action return Tr::tr("User command #%1").arg(index.row() + 1); case 1: // Command - return m_q->userCommandMap().value(index.row() + 1); + return m_commandMap.value(index.row() + 1); } } @@ -1137,7 +1208,7 @@ bool FakeVimUserCommandsModel::setData(const QModelIndex &index, { if (role == Qt::DisplayRole || role == Qt::EditRole) if (index.column() == 1) - m_q->userCommandMap()[index.row() + 1] = data.toString(); + m_commandMap[index.row() + 1] = data.toString(); return true; } @@ -1304,58 +1375,10 @@ void FakeVimPluginPrivate::createRelativeNumberWidget(IEditor *editor) } } -const char exCommandMapGroup[] = "FakeVimExCommand"; -const char userCommandMapGroup[] = "FakeVimUserCommand"; -const char reKey[] = "RegEx"; -const char cmdKey[] = "Cmd"; -const char idKey[] = "Command"; - void FakeVimPluginPrivate::writeSettings() { QSettings *settings = ICore::settings(); - theFakeVimSettings()->writeSettings(settings); - - { // block - settings->beginWriteArray(exCommandMapGroup); - int count = 0; - typedef ExCommandMap::const_iterator Iterator; - const Iterator end = exCommandMap().constEnd(); - for (Iterator it = exCommandMap().constBegin(); it != end; ++it) { - const QString id = it.key(); - const QRegExp re = it.value(); - - if ((defaultExCommandMap().contains(id) && defaultExCommandMap()[id] != re) - || (!defaultExCommandMap().contains(id) && !re.pattern().isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, id); - settings->setValue(reKey, re.pattern()); - ++count; - } - } - settings->endArray(); - } // block - - { // block - settings->beginWriteArray(userCommandMapGroup); - int count = 0; - typedef UserCommandMap::const_iterator Iterator; - const Iterator end = userCommandMap().constEnd(); - for (Iterator it = userCommandMap().constBegin(); it != end; ++it) { - const int key = it.key(); - const QString cmd = it.value(); - - if ((defaultUserCommandMap().contains(key) - && defaultUserCommandMap()[key] != cmd) - || (!defaultUserCommandMap().contains(key) && !cmd.isEmpty())) { - settings->setArrayIndex(count); - settings->setValue(idKey, key); - settings->setValue(cmdKey, cmd); - ++count; - } - } - settings->endArray(); - } // block } void FakeVimPluginPrivate::readSettings() @@ -2211,6 +2234,26 @@ ExCommandMap &FakeVimExCommandsWidget::defaultExCommandMap() return m_q->defaultExCommandMap(); } +ExCommandMap FakeVimExCommandsWidget::exCommandMapFromWidget() +{ + ExCommandMap map; + int n = commandList()->topLevelItemCount(); + for (int i = 0; i != n; ++i) { + QTreeWidgetItem *section = commandList()->topLevelItem(i); + int m = section->childCount(); + for (int j = 0; j != m; ++j) { + QTreeWidgetItem *item = section->child(j); + const QString name = item->data(0, CommandRole).toString(); + const QString regex = item->data(2, Qt::DisplayRole).toString(); + if ((regex.isEmpty() && defaultExCommandMap().value(name).isEmpty()) + || (!regex.isEmpty() && defaultExCommandMap().value(name).pattern() == regex)) + continue; + map[name] = QRegExp(regex); + } + } + return map; +} + UserCommandMap &FakeVimUserCommandsPage::userCommandMap() { return m_q->userCommandMap(); @@ -2221,6 +2264,11 @@ UserCommandMap &FakeVimUserCommandsPage::defaultUserCommandMap() return m_q->defaultUserCommandMap(); } +UserCommandMap FakeVimUserCommandsPage::currentCommandMap() +{ + return m_model->commandMap(); +} + /////////////////////////////////////////////////////////////////////// // // FakeVimPlugin From 7743532c7c5596beec8bc5354cc4c6078d81645e Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Fri, 12 Jan 2018 21:27:34 +0100 Subject: [PATCH 33/43] Locator: Document the JavaScript filter Change-Id: Idf56eb4d4620e0517b855485ba88dd92b468e850 Reviewed-by: Leena Miettinen --- doc/src/editors/creator-editors.qdoc | 85 ++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/doc/src/editors/creator-editors.qdoc b/doc/src/editors/creator-editors.qdoc index 79742e736f1..72023523c3b 100644 --- a/doc/src/editors/creator-editors.qdoc +++ b/doc/src/editors/creator-editors.qdoc @@ -2866,6 +2866,9 @@ \li Running text editing macros that you record and save (\c {rm}). For more information, see \l{Using Text Editing Macros} + \li Executing JavaScript (\c {=}), especially useful for calculations. + For more information, see \l{Executing JavaScript}. + \li Executing shell commands (\c {!}) \li Executing version control system commands (\c {git}). For more @@ -3048,4 +3051,86 @@ \endlist + \section1 Executing JavaScript + + The locator provides access to a JavaScript interpreter, that can be used to + perform calculations. + + Beside simple mathematical operations, like ((1 + 2) * 3), the following + built-in functions exist: + + \table + \header + \li Function + \li Purpose + \row + \li abs(x) + \li Returns the absolute value of x + \row + \li acos(x) + \li Returns the arccosine of x, in radians + \row + \li asin(x) + \li Returns the arcsine of x, in radians + \row + \li atan(x) + \li Returns the arctangent of x, in radians + \row + \li atan2(x, y) + \li Returns the arctangent of the quotient of its arguments + \row + \li bin(x) + \li Returns the binary representation of x + \row + \li ceil(x) + \li Returns the value of x rounded up to the next integer + \row + \li cos(x) + \li Returns the cosine of x (x is in radians) + \row + \li exp(x) + \li Returns the value of E to the power of x + \row + \li e() + \li Returns Euler's number E (2.71828...) + \row + \li floor(x) + \li Returns the value of x rounded down to the next integer + \row + \li hex(x) + \li Returns the hexadecimal representation of x + \row + \li log(x) + \li Returns the natural logarithm (base E) of x + \row + \li max(x, y) + \li Returns the higher value of x and y + \row + \li min(x, y) + \li Returns the lower value of x and y + \row + \li oct(x) + \li Returns the octal representation of x + \row + \li pi() + \li Returns PI (3.14159...) + \row + \li pow(x, y) + \li Returns the value of x to the power of y + \row + \li random() + \li Returns a random number between 0 and 1 + \row + \li round(x) + \li Returns the value of x rounded to the next integer + \row + \li sin(x) + \li Returns the sine of x (x is in radians) + \row + \li sqrt(x) + \li Returns the square root of x + \row + \li tan(x) + \li Returns the tangent of x (x is in radians) + \endtable */ From ff0d67dcd210f7d652799e0d16e1532a52116fcf Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 22 Jan 2018 16:45:49 +0100 Subject: [PATCH 34/43] Update qbs submodule To HEAD of 1.11 branch. Also do the adaptations necessary because of the branch switch. Change-Id: Ief69ef014c10397c14fcd68a9ca770d1391d5491 Reviewed-by: Joerg Bornemann --- qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs | 2 +- src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp | 2 +- src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp | 2 +- src/shared/qbs | 2 +- src/src.qbs | 1 + 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs index 492a6fe457a..6c770999069 100644 --- a/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs +++ b/qbs/modules/qbsbuildconfig/qbsbuildconfig.qbs @@ -14,7 +14,7 @@ Module { ? ["@loader_path/" + FileInfo.relativePath('/' + appInstallDir, '/' + libInstallDir)] : ["$ORIGIN/..", "$ORIGIN/../" + qtc.ide_library_path] property string resourcesInstallDir: qtc.ide_data_path + "/qbs" - property string pluginsInstallDir: qtc.ide_plugin_path + property string pluginsInstallDir: qtc.ide_plugin_path + "/qbs/plugins" property string appInstallDir: qtc.ide_bin_path property string libexecInstallDir: qtc.ide_libexec_path property bool installHtml: false diff --git a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp index 3e7ac54eb43..f0a1fb72358 100644 --- a/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp +++ b/src/plugins/qbsprojectmanager/qbsprofilessettingspage.cpp @@ -109,7 +109,7 @@ QbsProfilesSettingsWidget::QbsProfilesSettingsWidget(QWidget *parent) m_ui.settingsDirCheckBox->setText(tr("Store profiles in %1 settings directory") .arg(Core::Constants::IDE_DISPLAY_NAME)); m_ui.settingsDirCheckBox->setChecked(QbsProjectManagerSettings::useCreatorSettingsDirForQbs()); - m_ui.versionValueLabel->setText(qbs::LanguageInfo::qbsVersion()); + m_ui.versionValueLabel->setText(qbs::LanguageInfo::qbsVersion().toString()); connect(ProjectExplorer::KitManager::instance(), &ProjectExplorer::KitManager::kitsChanged, this, &QbsProfilesSettingsWidget::refreshKitsList); connect(m_ui.settingsDirCheckBox, &QCheckBox::stateChanged, [this]() { diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 3c0e2eceacf..7702b4551a9 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -246,7 +246,7 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const QProcessEnvironment procEnv = env.toProcessEnvironment(); procEnv.insert(QLatin1String("QBS_RUN_FILE_PATH"), executable()); qbs::RunEnvironment qbsRunEnv = project->qbsProject().getRunEnvironment(product, - qbs::InstallOptions(), procEnv, QbsManager::settings()); + qbs::InstallOptions(), procEnv, QStringList(), QbsManager::settings()); qbs::ErrorInfo error; procEnv = qbsRunEnv.runEnvironment(&error); if (error.hasError()) { diff --git a/src/shared/qbs b/src/shared/qbs index d3e137c2024..6655d563c3c 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit d3e137c20248f6852a91341782011ca58534ed21 +Subproject commit 6655d563c3cac6dbfd61bfb3dd15ae5b9467d5ae diff --git a/src/src.qbs b/src/src.qbs index 28246e5476e..ff52425d5de 100644 --- a/src/src.qbs +++ b/src/src.qbs @@ -35,6 +35,7 @@ Project { qbsBaseDir + "/src/plugins/plugins.qbs", qbsBaseDir + "/share/share.qbs", qbsBaseDir + "/src/app/apps.qbs", + qbsBaseDir + "/src/shared/bundledqt/bundledqt.qbs", qbsBaseDir + "/src/shared/json/json.qbs", ] } From 76d58e83039e50e5b584dfd3a45d782ee4835032 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Fri, 19 Jan 2018 19:28:52 +0100 Subject: [PATCH 35/43] JavaScriptFilter: Add engine reset MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I80c0e1c9270c9a67aa2494eeab1ccd942bf1885e Reviewed-by: André Hartmann Reviewed-by: Eike Ziller --- .../coreplugin/locator/javascriptfilter.cpp | 34 +++++++++++++------ .../coreplugin/locator/javascriptfilter.h | 4 ++- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/plugins/coreplugin/locator/javascriptfilter.cpp b/src/plugins/coreplugin/locator/javascriptfilter.cpp index 02803ecf728..6255101dca0 100644 --- a/src/plugins/coreplugin/locator/javascriptfilter.cpp +++ b/src/plugins/coreplugin/locator/javascriptfilter.cpp @@ -32,6 +32,11 @@ namespace Core { namespace Internal { +enum JavaScriptAction +{ + ResetEngine = QVariant::UserType + 1 +}; + JavaScriptFilter::JavaScriptFilter() { setId("JavaScriptFilter"); @@ -48,7 +53,8 @@ void JavaScriptFilter::prepareSearch(const QString &entry) { Q_UNUSED(entry); - setupEngine(); + if (!m_engine) + setupEngine(); } QList JavaScriptFilter::matchesFor( @@ -56,13 +62,17 @@ QList JavaScriptFilter::matchesFor( { Q_UNUSED(future); - const QString result = m_engine->evaluate(entry).toString(); - const QString expression = entry + " = " + result; - QList entries; - entries.append({this, expression, QVariant()}); - entries.append({this, tr("Copy to clipboard: %1").arg(result), result}); - entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression}); + if (entry.trimmed().isEmpty()) { + entries.append({this, tr("Reset Engine"), QVariant(ResetEngine, nullptr)}); + } else { + const QString result = m_engine->evaluate(entry).toString(); + const QString expression = entry + " = " + result; + + entries.append({this, expression, QVariant()}); + entries.append({this, tr("Copy to clipboard: %1").arg(result), result}); + entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression}); + } return entries; } @@ -77,6 +87,11 @@ void JavaScriptFilter::accept(Core::LocatorFilterEntry selection, QString *newTe if (selection.internalData.isNull()) return; + if (selection.internalData.userType() == ResetEngine) { + m_engine.reset(); + return; + } + QClipboard *clipboard = QGuiApplication::clipboard(); clipboard->setText(selection.internalData.toString()); } @@ -89,10 +104,7 @@ void JavaScriptFilter::refresh(QFutureInterface &future) void JavaScriptFilter::setupEngine() { - if (m_engine) - return; - - m_engine = new QJSEngine(this); + m_engine.reset(new QJSEngine); m_engine->evaluate( "function abs(x) { return Math.abs(x); }\n" "function acos(x) { return Math.acos(x); }\n" diff --git a/src/plugins/coreplugin/locator/javascriptfilter.h b/src/plugins/coreplugin/locator/javascriptfilter.h index 50f5e85c3b1..9bf3ac51949 100644 --- a/src/plugins/coreplugin/locator/javascriptfilter.h +++ b/src/plugins/coreplugin/locator/javascriptfilter.h @@ -27,6 +27,8 @@ #include +#include + QT_BEGIN_NAMESPACE class QJSEngine; QT_END_NAMESPACE @@ -51,7 +53,7 @@ public: private: void setupEngine(); - QJSEngine *m_engine = nullptr; + mutable std::unique_ptr m_engine; }; } // namespace Internal From 92d32c3a2618719383d4f8678bfd4f5ee041a198 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Sat, 13 Jan 2018 19:02:56 +0100 Subject: [PATCH 36/43] QmlDesigner: Make pimpl pointer private For some weird reason the d pointer of the model has been public. This is against all rules and therefore it is now private. To avoid adding too many friends I added a protected getter to AbstractProperty. Change-Id: I3ee77475a85063574d0b0c7c3d43d28deaa7eae6 Reviewed-by: Tim Jenssen --- .../components/propertyeditor/propertyeditorview.h | 3 +-- .../components/stateseditor/stateseditorwidget.h | 2 -- .../designercore/include/abstractproperty.h | 1 + src/plugins/qmldesigner/designercore/include/model.h | 11 ++++++----- .../designercore/model/abstractproperty.cpp | 5 +++++ .../designercore/model/bindingproperty.cpp | 8 ++++---- .../qmldesigner/designercore/model/internalnode_p.h | 2 -- .../designercore/model/nodeabstractproperty.cpp | 6 +++--- .../designercore/model/nodelistproperty.cpp | 2 +- .../qmldesigner/designercore/model/nodeproperty.cpp | 4 ++-- .../designercore/model/signalhandlerproperty.cpp | 4 ++-- .../designercore/model/variantproperty.cpp | 8 ++++---- 12 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h index b9028aad3db..316164f4c29 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.h @@ -44,6 +44,7 @@ class CollapseButton; class PropertyEditorWidget; class PropertyEditorView; class PropertyEditorQmlBackend; +class ModelNode; class PropertyEditorView: public AbstractView { @@ -66,8 +67,6 @@ public: void modelAboutToBeDetached(Model *model) override; - ModelState modelState() const; - void variantPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) override; void bindingPropertiesChanged(const QList& propertyList, PropertyChangeFlags propertyChange) override; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h index 231f4bfb431..8455ec63100 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorwidget.h @@ -35,8 +35,6 @@ QT_END_NAMESPACE namespace QmlDesigner { -class Model; -class ModelState; class StatesEditorModel; class StatesEditorView; class NodeInstanceView; diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index b3e1c164130..65f3f666beb 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -108,6 +108,7 @@ protected: AbstractProperty(const PropertyName &propertyName, const Internal::InternalNodePointer &internalNode, Model* model, AbstractView *view); AbstractProperty(const Internal::InternalPropertyPointer &property, Model* model, AbstractView *view); Internal::InternalNodePointer internalNode() const; + Internal::ModelPrivate *privateModel() const; private: PropertyName m_propertyName; diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index b3a146b1746..d5f16be0ed4 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -40,7 +40,10 @@ QT_END_NAMESPACE namespace QmlDesigner { -namespace Internal { class ModelPrivate; } +namespace Internal { +class ModelPrivate; +class WriteLocker; +} //Internal class AnchorLine; class ModelNode; @@ -61,12 +64,10 @@ typedef QList > PropertyListType; class QMLDESIGNERCORE_EXPORT Model : public QObject { friend class QmlDesigner::ModelNode; - friend class QmlDesigner::NodeState; - friend class QmlDesigner::ModelState; - friend class QmlDesigner::NodeAnchors; friend class QmlDesigner::AbstractProperty; friend class QmlDesigner::AbstractView; friend class Internal::ModelPrivate; + friend class Internal::WriteLocker; Q_OBJECT @@ -116,7 +117,7 @@ public: protected: Model(); -public: +private: Internal::ModelPrivate *d; }; diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index fa5595a4203..40a9d757766 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -106,6 +106,11 @@ Internal::InternalNodePointer AbstractProperty::internalNode() const return m_internalNode; } +Internal::ModelPrivate *AbstractProperty::privateModel() const +{ + return m_model ? m_model->d : nullptr; +} + Model *AbstractProperty::model() const { return m_model.data(); diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 018075da663..dfea640fd57 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -84,9 +84,9 @@ void BindingProperty::setExpression(const QString &expression) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setBindingProperty(internalNode(), name(), expression); + privateModel()->setBindingProperty(internalNode(), name(), expression); } QString BindingProperty::expression() const @@ -239,9 +239,9 @@ void BindingProperty::setDynamicTypeNameAndExpression(const TypeName &typeName, } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isBindingProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setDynamicBindingProperty(internalNode(), name(), typeName, expression); + privateModel()->setDynamicBindingProperty(internalNode(), name(), typeName, expression); } QDebug operator<<(QDebug debug, const BindingProperty &property) diff --git a/src/plugins/qmldesigner/designercore/model/internalnode_p.h b/src/plugins/qmldesigner/designercore/model/internalnode_p.h index 9f70fe1e94f..0997c5a4ff4 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode_p.h +++ b/src/plugins/qmldesigner/designercore/model/internalnode_p.h @@ -40,8 +40,6 @@ namespace QmlDesigner { -class Model; - namespace Internal { class InternalProperty; diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 488988bbeb3..27b5a5c7469 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -86,18 +86,18 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNode throw InvalidReparentingException(__LINE__, __FUNCTION__, __FILE__); if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); if (modelNode.hasParentProperty()) { Internal::InternalNodeAbstractProperty::Pointer oldParentProperty = modelNode.internalNode()->parentProperty(); - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); Q_ASSERT(!oldParentProperty.isNull()); } else { - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), isNodeList, dynamicTypeName); } } diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index 1d03c894181..d4735160c50 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -99,7 +99,7 @@ void NodeListProperty::slide(int from, int to) const if (to > count() - 1) throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, ""); - model()->d->changeNodeOrder(internalNode(), name(), from, to); + privateModel()->changeNodeOrder(internalNode(), name(), from, to); } void NodeListProperty::reparentHere(const ModelNode &modelNode) diff --git a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp index 6d9bcfd1de3..2d262c2ab63 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeproperty.cpp @@ -59,9 +59,9 @@ void NodeProperty::setModelNode(const ModelNode &modelNode) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->reparentNode(internalNode(), name(), modelNode.internalNode(), false); //### we have to add a flag that this is not a list + privateModel()->reparentNode(internalNode(), name(), modelNode.internalNode(), false); //### we have to add a flag that this is not a list } ModelNode NodeProperty::modelNode() const diff --git a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp index 21659a37e2f..3ad9280e7ad 100644 --- a/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/signalhandlerproperty.cpp @@ -71,9 +71,9 @@ void SignalHandlerProperty::setSource(const QString &source) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isSignalHandlerProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setSignalHandlerProperty(internalNode(), name(), source); + privateModel()->setSignalHandlerProperty(internalNode(), name(), source); } QString SignalHandlerProperty::source() const diff --git a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp index 259a6900ee2..dbdf1bb74e0 100644 --- a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp @@ -71,9 +71,9 @@ void VariantProperty::setValue(const QVariant &value) } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setVariantProperty(internalNode(), name(), value); + privateModel()->setVariantProperty(internalNode(), name(), value); } QVariant VariantProperty::value() const @@ -120,9 +120,9 @@ void VariantProperty::setDynamicTypeNameAndValue(const TypeName &type, const QVa } if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isVariantProperty()) - model()->d->removeProperty(internalNode()->property(name())); + privateModel()->removeProperty(internalNode()->property(name())); - model()->d->setDynamicVariantProperty(internalNode(), name(), type, value); + privateModel()->setDynamicVariantProperty(internalNode(), name(), type, value); } void VariantProperty::setDynamicTypeNameAndEnumeration(const TypeName &type, const EnumerationName &enumerationName) From a7515d25a971aeaf5c54cc9a52a325e05a7c6e98 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Sat, 13 Jan 2018 18:49:39 +0100 Subject: [PATCH 37/43] QmlDesigner: Avoid detachs The non const overloads of first() and last() do detach if the reference count is higher than 1. Therefore we use constFirst() and constLast() instead. Change-Id: I737cfc428f1c21f16185b9b51175e181c0ec7068 Reviewed-by: Alessandro Portale --- .../qml/qmlpuppet/types/enumeration.cpp | 2 +- .../componentcore/designeractionmanager.cpp | 2 +- .../componentcore/findimplementation.cpp | 2 +- .../componentcore/layoutingridlayout.cpp | 8 ++--- .../modelnodecontextmenu_helper.cpp | 2 +- .../componentcore/modelnodeoperations.cpp | 16 +++++----- .../components/debugview/debugview.cpp | 2 +- .../formeditor/abstractformeditortool.cpp | 2 +- .../components/formeditor/anchorindicator.cpp | 2 +- .../formeditor/bindingindicator.cpp | 2 +- .../components/formeditor/formeditorscene.cpp | 6 ++-- .../components/formeditor/formeditorview.cpp | 2 +- .../components/formeditor/movemanipulator.cpp | 10 +++--- .../components/formeditor/movetool.cpp | 8 ++--- .../formeditor/onedimensionalcluster.cpp | 8 ++--- .../formeditor/onedimensionalcluster.h | 2 +- .../components/formeditor/resizetool.cpp | 4 +-- .../formeditor/selectionindicator.cpp | 8 ++--- .../components/formeditor/selectiontool.cpp | 2 +- .../components/formeditor/snapper.cpp | 8 ++--- .../components/integration/designdocument.cpp | 4 +-- .../integration/designdocumentview.cpp | 2 +- .../components/navigator/navigatorview.cpp | 2 +- .../propertyeditorcontextobject.cpp | 4 +-- .../propertyeditorqmlbackend.cpp | 4 +-- .../propertyeditor/propertyeditorview.cpp | 4 +-- .../stateseditorimageprovider.cpp | 2 +- .../components/texteditor/texteditorview.cpp | 2 +- .../texteditor/texteditorwidget.cpp | 2 +- .../filemanager/qmlrefactoring.cpp | 2 +- .../designercore/include/forwardview.h | 2 +- .../instances/nodeinstanceview.cpp | 4 +-- .../designercore/metainfo/metainforeader.cpp | 4 +-- .../designercore/metainfo/nodehints.cpp | 2 +- .../designercore/metainfo/nodemetainfo.cpp | 28 ++++++++-------- .../metainfo/subcomponentmanager.cpp | 2 +- .../designercore/model/abstractview.cpp | 8 ++--- .../designercore/model/bindingproperty.cpp | 2 +- .../qmldesigner/designercore/model/model.cpp | 8 ++--- .../designercore/model/modelnode.cpp | 6 ++-- .../designercore/model/modeltotextmerger.cpp | 2 +- .../designercore/model/qmltextgenerator.cpp | 4 +-- .../designercore/model/rewriterview.cpp | 6 ++-- .../designercore/model/texttomodelmerger.cpp | 18 +++++------ src/plugins/qmldesigner/designmodewidget.cpp | 2 +- src/plugins/qmldesigner/documentmanager.cpp | 2 +- .../colortool/colortool.cpp | 4 +-- .../connectioneditor/backendmodel.cpp | 2 +- .../connectioneditor/bindingmodel.cpp | 6 ++-- .../connectioneditor/connectionmodel.cpp | 4 +-- .../connectioneditor/connectionviewwidget.cpp | 26 +++++++-------- .../dynamicpropertiesmodel.cpp | 6 ++-- .../pathtool/pathitem.cpp | 32 +++++++++---------- .../pathtool/pathselectionmanipulator.cpp | 2 +- .../pathtool/pathtool.cpp | 4 +-- .../sourcetool/sourcetool.cpp | 2 +- .../texttool/texttool.cpp | 2 +- src/plugins/qmldesigner/qmldesignerplugin.cpp | 4 +-- 58 files changed, 160 insertions(+), 160 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp index 094eb5ffc08..a77f460f4f0 100644 --- a/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp +++ b/share/qtcreator/qml/qmlpuppet/types/enumeration.cpp @@ -54,7 +54,7 @@ Enumeration::Enumeration(const QString &scope, const QString &name) QmlDesigner::EnumerationName QmlDesigner::Enumeration::scope() const { - return m_enumerationName.split('.').first(); + return m_enumerationName.split('.').constFirst(); } EnumerationName Enumeration::name() const diff --git a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp index b19e06e45b6..629f290026e 100644 --- a/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp +++ b/src/plugins/qmldesigner/components/componentcore/designeractionmanager.cpp @@ -359,7 +359,7 @@ bool selectionHasSameParentAndInBaseState(const SelectionContext &context) bool isNotInLayout(const SelectionContext &context) { if (selectionNotEmpty(context)) { - ModelNode selectedModelNode = context.selectedModelNodes().first(); + const ModelNode &selectedModelNode = context.selectedModelNodes().constFirst(); ModelNode parentModelNode; if (selectedModelNode.hasParentProperty()) diff --git a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp index 1d88bf56a00..a22a72498f5 100644 --- a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp @@ -130,7 +130,7 @@ protected: if (m_insideObject) { QStringList stringList = textAt(node->qualifiedId->firstSourceLocation(), node->qualifiedId->lastSourceLocation()).split(QLatin1String(".")); - const QString itemid = stringList.isEmpty() ? QString() : stringList.first(); + const QString itemid = stringList.isEmpty() ? QString() : stringList.constFirst(); if (itemid == m_itemId) { m_implemenations.append(node->statement->firstSourceLocation()); diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index 39638e3fcba..ed05faba12c 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -57,7 +57,7 @@ static int findFirstBigger(const QVector &v, int tolerance) if (v.isEmpty()) return 0; - int last = v.first(); + int last = v.constFirst(); for (int i = 0; i < v.length(); ++i) { if (v.value(i) > last + tolerance) return i; @@ -257,7 +257,7 @@ void LayoutInGridLayout::collectItemNodes() m_qmlItemNodes.append(itemNode); } } - m_parentNode = m_qmlItemNodes.first().instanceParentItem(); + m_parentNode = m_qmlItemNodes.constFirst().instanceParentItem(); } void LayoutInGridLayout::collectOffsets() @@ -287,10 +287,10 @@ void LayoutInGridLayout::sortOffsets() void LayoutInGridLayout::calculateGridOffsets() { if (!m_xTopOffsets.isEmpty()) - m_startX = m_xTopOffsets.first(); + m_startX = m_xTopOffsets.constFirst(); if (!m_yTopOffsets.isEmpty()) - m_startY = m_yTopOffsets.first(); + m_startY = m_yTopOffsets.constFirst(); const int defaultWidthTolerance = 64; const int defaultHeightTolerance = 64; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp index e70de03f745..195ce608d4c 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp @@ -40,7 +40,7 @@ static inline bool itemsHaveSameParent(const QList &siblingList) return false; - QmlItemNode item(siblingList.first()); + const QmlItemNode &item = siblingList.constFirst(); if (!item.isValid()) return false; diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index c3d7d9f43d6..85e67747502 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -285,7 +285,7 @@ void setVisible(const SelectionContext &selectionState) return; try { - selectionState.selectedModelNodes().first().variantProperty("visible").setValue(selectionState.toggled()); + selectionState.selectedModelNodes().constFirst().variantProperty("visible").setValue(selectionState.toggled()); } catch (const RewritingException &e) { //better save then sorry e.showException(); } @@ -657,7 +657,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState { ModelNode modelNode; if (selectionState.singleNodeIsSelected()) - modelNode = selectionState.selectedModelNodes().first(); + modelNode = selectionState.selectedModelNodes().constFirst(); bool isModelNodeRoot = true; @@ -690,7 +690,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState const QString fileName = currentDesignDocument.toString(); const QString typeName = currentDesignDocument.toFileInfo().baseName(); - QStringList signalNames = cleanSignalNames(getSortedSignalNameList(selectionState.selectedModelNodes().first())); + QStringList signalNames = cleanSignalNames(getSortedSignalNameList(selectionState.selectedModelNodes().constFirst())); QList usages = QmlJSEditor::FindReferences::findUsageOfType(fileName, typeName); @@ -701,12 +701,12 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState return; } - usages = FindImplementation::run(usages.first().path, typeName, itemId); + usages = FindImplementation::run(usages.constFirst().path, typeName, itemId); Core::ModeManager::activateMode(Core::Constants::MODE_EDIT); if (usages.count() > 0 && (addAlwaysNewSlot || usages.count() < 2) && (!isModelNodeRoot || addAlwaysNewSlot)) { - Core::EditorManager::openEditorAt(usages.first().path, usages.first().line, usages.first().col); + Core::EditorManager::openEditorAt(usages.constFirst().path, usages.constFirst().line, usages.constFirst().col); if (!signalNames.isEmpty()) { AddSignalHandlerDialog *dialog = new AddSignalHandlerDialog(Core::ICore::dialogParent()); @@ -732,7 +732,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState //Move cursor to correct curser position const QString filePath = Core::EditorManager::currentDocument()->filePath().toString(); QList usages = FindImplementation::run(filePath, typeName, itemId); - Core::EditorManager::openEditorAt(filePath, usages.first().line, usages.first().col + 1); + Core::EditorManager::openEditorAt(filePath, usages.constFirst().line, usages.constFirst().col + 1); } ); dialog->show(); @@ -740,7 +740,7 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState return; } - Core::EditorManager::openEditorAt(usages.first().path, usages.first().line, usages.first().col + 1); + Core::EditorManager::openEditorAt(usages.constFirst().path, usages.constFirst().line, usages.constFirst().col + 1); } void removeLayout(const SelectionContext &selectionContext) @@ -794,7 +794,7 @@ void moveToComponent(const SelectionContext &selectionContext) { ModelNode modelNode; if (selectionContext.singleNodeIsSelected()) - modelNode = selectionContext.selectedModelNodes().first(); + modelNode = selectionContext.selectedModelNodes().constFirst(); if (modelNode.isValid()) selectionContext.view()->model()->rewriterView()->moveToComponent(modelNode); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index 261b7ed978c..59afd1172fa 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -396,7 +396,7 @@ void DebugView::instancesChildrenChanged(const QVector & nodeList) void DebugView::customNotification(const AbstractView *view, const QString &identifier, const QList &nodeList, const QList &data) { if (identifier == "PuppetStatus" && data.count() == 1) { - m_debugViewWidget->setPuppetStatus(data.first().toString()); + m_debugViewWidget->setPuppetStatus(data.constFirst().toString()); } else if (isDebugViewEnabled()) { QTextStream message; diff --git a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp index 2cf53f0e79c..e4f76d58585 100644 --- a/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/abstractformeditortool.cpp @@ -265,7 +265,7 @@ void AbstractFormEditorTool::mouseReleaseEvent(const QList & ite QmlItemNode currentSelectedNode; if (view()->selectedModelNodes().count() == 1) { - currentSelectedNode = view()->selectedModelNodes().first(); + currentSelectedNode = view()->selectedModelNodes().constFirst(); if (!containsItemNode(itemList, currentSelectedNode)) { QmlItemNode selectedNode; diff --git a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp index 6d48240b03e..6cd4be56f8a 100644 --- a/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/anchorindicator.cpp @@ -89,7 +89,7 @@ void AnchorIndicator::setItems(const QList &itemList) clear(); if (itemList.count() == 1) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); QmlItemNode sourceQmlItemNode = m_formEditorItem->qmlItemNode(); if (!sourceQmlItemNode.modelNode().isRootNode()) { QmlAnchors qmlAnchors = sourceQmlItemNode.anchors(); diff --git a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp index 5bd4fe74532..766458ec59d 100644 --- a/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/bindingindicator.cpp @@ -116,7 +116,7 @@ void BindingIndicator::setItems(const QList &itemList) clear(); if (itemList.count() == 1) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); const QmlItemNode qmlItemNode = m_formEditorItem->qmlItemNode(); if (qmlItemNode.hasBindingProperty("x")) { diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp index be6437c8985..b9cba15c9e5 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorscene.cpp @@ -200,8 +200,8 @@ void FormEditorScene::dropEvent(QGraphicsSceneDragDropEvent * event) { currentTool()->dropEvent(removeLayerItems(itemsAt(event->scenePos())), event); - if (views().first()) - views().first()->setFocus(); + if (views().constFirst()) + views().constFirst()->setFocus(); } void FormEditorScene::dragEnterEvent(QGraphicsSceneDragDropEvent * event) @@ -237,7 +237,7 @@ QList FormEditorScene::itemsAt(const QPointF &pos) QTransform transform; if (!views().isEmpty()) - transform = views().first()->transform(); + transform = views().constFirst()->transform(); return items(pos, Qt::IntersectsItemShape, diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 1956dadb342..fad8a6817be 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -397,7 +397,7 @@ void FormEditorView::changeToCustomTool() int handlingRank = 0; AbstractCustomTool *selectedCustomTool = 0; - ModelNode selectedModelNode = selectedModelNodes().first(); + const ModelNode &selectedModelNode = selectedModelNodes().constFirst(); foreach (AbstractCustomTool *customTool, m_customToolList) { if (customTool->wantHandleItem(selectedModelNode) > handlingRank) { diff --git a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp index d55f85090ff..57a280d72bb 100644 --- a/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movemanipulator.cpp @@ -75,10 +75,10 @@ void MoveManipulator::setItems(const QList &itemList) { m_itemList = itemList; if (!m_itemList.isEmpty()) { - if (m_itemList.first()->parentItem()) - m_snapper.setContainerFormEditorItem(m_itemList.first()->parentItem()); + if (m_itemList.constFirst()->parentItem()) + m_snapper.setContainerFormEditorItem(m_itemList.constFirst()->parentItem()); else - m_snapper.setContainerFormEditorItem(m_itemList.first()); + m_snapper.setContainerFormEditorItem(m_itemList.constFirst()); m_snapper.setTransformtionSpaceFormEditorItem(m_snapper.containerFormEditorItem()); } } @@ -105,8 +105,8 @@ void MoveManipulator::synchronizeParent(const QList &itemList, void MoveManipulator::synchronizeInstanceParent(const QList &itemList) { - if (m_view->model() && !m_itemList.isEmpty() && m_itemList.first()->qmlItemNode().hasInstanceParent()) - synchronizeParent(itemList, m_itemList.first()->qmlItemNode().instanceParent()); + if (m_view->model() && !m_itemList.isEmpty() && m_itemList.constFirst()->qmlItemNode().hasInstanceParent()) + synchronizeParent(itemList, m_itemList.constFirst()->qmlItemNode().instanceParent()); } bool MoveManipulator::itemsCanReparented() const diff --git a/src/plugins/qmldesigner/components/formeditor/movetool.cpp b/src/plugins/qmldesigner/components/formeditor/movetool.cpp index b779216d613..4978c370267 100644 --- a/src/plugins/qmldesigner/components/formeditor/movetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/movetool.cpp @@ -106,10 +106,10 @@ void MoveTool::mouseMoveEvent(const QList &itemList, FormEditorItem *containerItem = containerFormEditorItem(itemList, m_movingItems); if (containerItem && view()->currentState().isBaseState()) { - if (containerItem != m_movingItems.first()->parentItem() + if (containerItem != m_movingItems.constFirst()->parentItem() && event->modifiers().testFlag(Qt::ShiftModifier)) { - FormEditorItem *movingItem = m_movingItems.first(); + const FormEditorItem *movingItem = m_movingItems.constFirst(); if (m_movingItems.count() > 1 || (movingItem->qmlItemNode().canBereparentedTo(containerItem->qmlItemNode()))) @@ -129,7 +129,7 @@ void MoveTool::hoverMoveEvent(const QList &itemList, return; } - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle) { view()->changeToResizeTool(); return; @@ -289,7 +289,7 @@ bool MoveTool::haveSameParent(const QList &itemList) if (itemList.isEmpty()) return false; - QGraphicsItem *firstParent = itemList.first()->parentItem(); + QGraphicsItem *firstParent = itemList.constFirst()->parentItem(); foreach (FormEditorItem* item, itemList) { if (firstParent != item->parentItem()) diff --git a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp index 864ae64b769..aee6bba6dc9 100644 --- a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp +++ b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.cpp @@ -53,17 +53,17 @@ double OneDimensionalCluster::mean() const if (m_coordinateList.size() == 1) { - return m_coordinateList.first(); + return m_coordinateList.constFirst(); } return sum(m_coordinateList) / m_coordinateList.size(); } -double OneDimensionalCluster::first() const +double OneDimensionalCluster::constFirst() const { Q_ASSERT(!m_coordinateList.isEmpty()); - return m_coordinateList.first(); + return m_coordinateList.constFirst(); } QList OneDimensionalCluster::createOneDimensionalClusterList(const QList & oneDimensionalCoordinateList) @@ -136,7 +136,7 @@ QList OneDimensionalCluster::reduceLines(const QList & oneDimens QList lineList; foreach (const OneDimensionalCluster &cluster, clusterList) - lineList.append(cluster.first()); + lineList.append(cluster.constFirst()); return lineList; } diff --git a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h index 83b93976297..5c5b1842884 100644 --- a/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h +++ b/src/plugins/qmldesigner/components/formeditor/onedimensionalcluster.h @@ -39,7 +39,7 @@ private: OneDimensionalCluster(const QList & coordinateList ); double mean() const; - double first() const; + double constFirst() const; static QList createOneDimensionalClusterList(const QList & oneDimensionalCoordinateList); static QList reduceOneDimensionalClusterList(const QList & unreducedClusterList, double maximumDistance); diff --git a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp index c9e8a977fd6..96b960867ca 100644 --- a/src/plugins/qmldesigner/components/formeditor/resizetool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/resizetool.cpp @@ -58,7 +58,7 @@ void ResizeTool::mousePressEvent(const QList &itemList, if (itemList.isEmpty()) return; - ResizeHandleItem *resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem *resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle && resizeHandle->resizeController().isValid()) { m_resizeManipulator.setHandle(resizeHandle); m_resizeManipulator.begin(event->scenePos()); @@ -85,7 +85,7 @@ void ResizeTool::hoverMoveEvent(const QList &itemList, return; } - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle && resizeHandle->resizeController().isValid()) { m_resizeManipulator.setHandle(resizeHandle); } else { diff --git a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp index c1b26877ad2..b9cbd74bba2 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectionindicator.cpp @@ -82,8 +82,8 @@ static QPolygonF boundingRectInLayerItemSpaceForItem(FormEditorItem *item, QGrap static bool checkSingleSelection(const QList &itemList) { return !itemList.isEmpty() - && itemList.first() - && itemList.first()->qmlItemNode().view()->singleSelectedModelNode().isValid(); + && itemList.constFirst() + && itemList.constFirst()->qmlItemNode().view()->singleSelectedModelNode().isValid(); } const int labelHeight = 16; @@ -112,7 +112,7 @@ void SelectionIndicator::setItems(const QList &itemList) } if (checkSingleSelection(itemList)) { - FormEditorItem *selectedItem = itemList.first(); + FormEditorItem *selectedItem = itemList.constFirst(); m_labelItem.reset(new QGraphicsPolygonItem(m_layerItem.data())); QGraphicsWidget *toolbar = DesignerActionManager::instance().createFormEditorToolBar(m_labelItem.get()); @@ -161,7 +161,7 @@ void SelectionIndicator::updateItems(const QList &itemList) if (checkSingleSelection(itemList) && m_labelItem) { - FormEditorItem *selectedItem = itemList.first(); + FormEditorItem *selectedItem = itemList.constFirst(); QPolygonF labelPolygon = boundingRectInLayerItemSpaceForItem(selectedItem, m_layerItem.data()); QRectF labelRect = labelPolygon.boundingRect(); QPointF pos = labelRect.topLeft(); diff --git a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp index 559cec498eb..52bcae4ff5b 100644 --- a/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/selectiontool.cpp @@ -126,7 +126,7 @@ void SelectionTool::hoverMoveEvent(const QList &itemList, { if (!itemList.isEmpty()) { - ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.first()); + ResizeHandleItem* resizeHandle = ResizeHandleItem::fromGraphicsItem(itemList.constFirst()); if (resizeHandle) { view()->changeToResizeTool(); return; diff --git a/src/plugins/qmldesigner/components/formeditor/snapper.cpp b/src/plugins/qmldesigner/components/formeditor/snapper.cpp index 5b8e02a288d..7a11b6c7e38 100644 --- a/src/plugins/qmldesigner/components/formeditor/snapper.cpp +++ b/src/plugins/qmldesigner/components/formeditor/snapper.cpp @@ -449,7 +449,7 @@ double Snapper::snappingDistance() const static QLineF mergedHorizontalLine(const QList &lineList) { if (lineList.count() == 1) - return lineList.first(); + return lineList.constFirst(); double minimumX = std::numeric_limits::max(); double maximumX = std::numeric_limits::min(); @@ -460,14 +460,14 @@ static QLineF mergedHorizontalLine(const QList &lineList) maximumX = qMax(maximumX, double(line.x2())); } - double y(lineList.first().y1()); + double y(lineList.constFirst().y1()); return QLineF(minimumX, y, maximumX, y); } static QLineF mergedVerticalLine(const QList &lineList) { if (lineList.count() == 1) - return lineList.first(); + return lineList.constFirst(); double minimumY = std::numeric_limits::max(); double maximumY = std::numeric_limits::min(); @@ -478,7 +478,7 @@ static QLineF mergedVerticalLine(const QList &lineList) maximumY = qMax(maximumY, double(line.y2())); } - double x(lineList.first().x1()); + double x(lineList.constFirst().x1()); return QLineF(x, minimumY, x, maximumY); } diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index 068915d13cd..9a7aa73676c 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -450,7 +450,7 @@ void DesignDocument::paste() ModelNode targetNode; if (!view.selectedModelNodes().isEmpty()) - targetNode = view.selectedModelNodes().first(); + targetNode = view.selectedModelNodes().constFirst(); //In case we copy and paste a selection we paste in the parent item if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) @@ -495,7 +495,7 @@ void DesignDocument::paste() ModelNode targetNode; if (!view.selectedModelNodes().isEmpty()) - targetNode = view.selectedModelNodes().first(); + targetNode = view.selectedModelNodes().constFirst(); if (!targetNode.isValid()) targetNode = view.rootModelNode(); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp index b371fe3fe6e..89d27cd5f0e 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentview.cpp @@ -219,7 +219,7 @@ void DesignDocumentView::copyModelNodes(const QList &nodesToCopy) copyModel->attachView(&view); if (selectedNodes.count() == 1) { - ModelNode selectedNode(selectedNodes.first()); + const ModelNode &selectedNode = selectedNodes.constFirst(); if (!selectedNode.isValid()) return; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index a90800d76f0..8b81df3355d 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -454,7 +454,7 @@ void NavigatorView::updateItemSelection() blockSelectionChangedSignal(blocked); if (!selectedModelNodes().isEmpty()) - treeWidget()->scrollTo(indexForModelNode(selectedModelNodes().first())); + treeWidget()->scrollTo(indexForModelNode(selectedModelNodes().constFirst())); // make sure selected nodes a visible foreach (const QModelIndex &selectedIndex, itemSelection.indexes()) { diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index 832e733872b..6966bfe187e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -145,7 +145,7 @@ void PropertyEditorContextObject::toogleExportAlias() if (rewriterView->selectedModelNodes().isEmpty()) return; - ModelNode selectedNode = rewriterView->selectedModelNodes().first(); + const ModelNode &selectedNode = rewriterView->selectedModelNodes().constFirst(); if (QmlObjectNode::isValidQmlObjectNode(selectedNode)) { QmlObjectNode objectNode(selectedNode); @@ -184,7 +184,7 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) if (rewriterView->selectedModelNodes().isEmpty()) return; - ModelNode selectedNode = rewriterView->selectedModelNodes().first(); + ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); try { RewriterTransaction transaction = diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index a8e2b42e595..7c6435a1b89 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -550,12 +550,12 @@ QString PropertyEditorQmlBackend::locateQmlFile(const NodeMetaInfo &info, const //Check for qml files with versions first - const QString withoutDir = relativePath.split(QStringLiteral("/")).last(); + const QString withoutDir = relativePath.split(QStringLiteral("/")).constLast(); if (importDirVersion.exists(withoutDir)) return importDirVersion.absoluteFilePath(withoutDir); - const QString withoutDirWithVersion = relativePathWithVersion.split(QStringLiteral("/")).last(); + const QString withoutDirWithVersion = relativePathWithVersion.split(QStringLiteral("/")).constLast(); const QStringList possiblePaths = { importDir.absoluteFilePath(relativePathWithVersion), diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index 4cad2d08cc0..63e415f1b96 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -510,8 +510,8 @@ void PropertyEditorView::selectedNodesChanged(const QList &selectedNo if (selectedNodeList.isEmpty() || selectedNodeList.count() > 1) select(ModelNode()); - else if (m_selectedNode != selectedNodeList.first()) - select(selectedNodeList.first()); + else if (m_selectedNode != selectedNodeList.constFirst()) + select(selectedNodeList.constFirst()); } void PropertyEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp index 36b3794fd21..ec434abb59f 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditorimageprovider.cpp @@ -43,7 +43,7 @@ QImage StatesEditorImageProvider::requestImage(const QString &id, QSize *size, c bool nodeInstanceViewIsDetached = m_nodeInstanceView.isNull() || !m_nodeInstanceView->model(); if (!nodeInstanceViewIsDetached) { - QString imageId = id.split(QLatin1Char('-')).first(); + QString imageId = id.split(QLatin1Char('-')).constFirst(); if (imageId == QLatin1String("baseState")) { image = m_nodeInstanceView->statePreviewImage(m_nodeInstanceView->rootModelNode()); } else { diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp index 495f6762ca3..a5c4441e6ea 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorview.cpp @@ -186,7 +186,7 @@ void TextEditorView::documentMessagesChanged(const QList &error if (errors.isEmpty()) { m_widget->clearStatusBar(); } else { - const DocumentMessage error = errors.first(); + const DocumentMessage &error = errors.constFirst(); m_widget->setStatusText(QString("%1 (Line: %2)").arg(error.description()).arg(error.line())); } } diff --git a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp index 8c0e715ba99..4cf464d4e76 100644 --- a/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp +++ b/src/plugins/qmldesigner/components/texteditor/texteditorwidget.cpp @@ -126,7 +126,7 @@ void TextEditorWidget::jumpTextCursorToSelectedModelNode() return; if (!m_textEditorView->selectedModelNodes().isEmpty()) - selectedNode = m_textEditorView->selectedModelNodes().first(); + selectedNode = m_textEditorView->selectedModelNodes().constFirst(); if (selectedNode.isValid()) { RewriterView *rewriterView = m_textEditorView->model()->rewriterView(); diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp index a2b4c9b3fc8..809fe37ed47 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp @@ -66,7 +66,7 @@ bool QmlRefactoring::reparseDocument() qDebug() << "*** QML text:" << textModifier->text(); QString errorMessage = QStringLiteral("Parsing Error"); if (!tmpDocument->diagnosticMessages().isEmpty()) - errorMessage = tmpDocument->diagnosticMessages().first().message; + errorMessage = tmpDocument->diagnosticMessages().constFirst().message; qDebug() << "*** " << errorMessage; return false; diff --git a/src/plugins/qmldesigner/designercore/include/forwardview.h b/src/plugins/qmldesigner/designercore/include/forwardview.h index b34cd107e92..d317bec7932 100644 --- a/src/plugins/qmldesigner/designercore/include/forwardview.h +++ b/src/plugins/qmldesigner/designercore/include/forwardview.h @@ -280,7 +280,7 @@ ViewType *ForwardView::firstView() const if (m_targetViewList.isEmpty()) return 0; - return m_targetViewList.first().data(); + return m_targetViewList.constFirst().data(); } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 197c7d50646..823f966d8c0 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -881,8 +881,8 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand() if (versionString.contains(QStringLiteral("."))) { const QStringList splittedString = versionString.split(QStringLiteral(".")); - majorVersion = splittedString.first().toInt(); - minorVersion = splittedString.last().toInt(); + majorVersion = splittedString.constFirst().toInt(); + minorVersion = splittedString.constLast().toInt(); } bool isItem = false; diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp index d2d906e6657..1caff4817e3 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainforeader.cpp @@ -278,9 +278,9 @@ void MetaInfoReader::setVersion(const QString &versionNumber) int val; bool ok; if (versionNumber.contains(QLatin1Char('.'))) { - val = versionNumber.split(QLatin1Char('.')).first().toInt(&ok); + val = versionNumber.split(QLatin1Char('.')).constFirst().toInt(&ok); major = ok ? val : major; - val = versionNumber.split(QLatin1Char('.')).last().toInt(&ok); + val = versionNumber.split(QLatin1Char('.')).constLast().toInt(&ok); minor = ok ? val : minor; } else { val = versionNumber.toInt(&ok); diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index 209754d125b..1a38b0a631f 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -96,7 +96,7 @@ QmlDesigner::NodeHints::NodeHints(const ModelNode &node) : m_modelNode(node) modelNode().type(), modelNode().majorVersion(), modelNode().minorVersion()); if (!itemLibraryEntryList.isEmpty()) - m_hints = itemLibraryEntryList.first().hints(); + m_hints = itemLibraryEntryList.constFirst().hints(); } } diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index f5bb5d1ba68..46801cf0e0d 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -709,7 +709,7 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i } else { m_isFileComponent = true; const Imports *imports = context()->imports(document()); - ImportInfo importInfo = imports->info(lookupNameComponent().last(), context().data()); + ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data()); if (importInfo.isValid() && importInfo.type() == ImportType::Library) { m_majorVersion = importInfo.version().majorVersion(); m_minorVersion = importInfo.version().minorVersion(); @@ -729,7 +729,7 @@ const CppComponentValue *NodeMetaInfoPrivate::getCppComponentValue() const const QList nameComponents = m_qualfiedTypeName.split('.'); if (nameComponents.size() < 2) return 0; - const TypeName type = nameComponents.last(); + const TypeName &type = nameComponents.constLast(); TypeName module; for (int i = 0; i < nameComponents.size() - 1; ++i) { @@ -821,8 +821,8 @@ bool NodeMetaInfoPrivate::isPropertyWritable(const PropertyName &propertyName) c if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -854,8 +854,8 @@ bool NodeMetaInfoPrivate::isPropertyList(const PropertyName &propertyName) const if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -883,8 +883,8 @@ bool NodeMetaInfoPrivate::isPropertyPointer(const PropertyName &propertyName) co if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -915,8 +915,8 @@ bool NodeMetaInfoPrivate::isPropertyEnum(const PropertyName &propertyName) const if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -947,8 +947,8 @@ QString NodeMetaInfoPrivate::propertyEnumScope(const PropertyName &propertyName) if (propertyName.contains('.')) { const PropertyNameList parts = propertyName.split('.'); - const PropertyName objectName = parts.first(); - const PropertyName rawPropertyName = parts.last(); + const PropertyName &objectName = parts.constFirst(); + const PropertyName &rawPropertyName = parts.constLast(); const TypeName objectType = propertyType(objectName); if (isValueType(objectType)) @@ -989,7 +989,7 @@ static QByteArray getUnqualifiedName(const QByteArray &name) const QList nameComponents = name.split('.'); if (nameComponents.size() < 2) return name; - return nameComponents.last(); + return nameComponents.constLast(); } static QByteArray getPackage(const QByteArray &name) @@ -1138,7 +1138,7 @@ QString NodeMetaInfoPrivate::importDirectoryPath() const if (isValid()) { const Imports *imports = context()->imports(document()); - ImportInfo importInfo = imports->info(lookupNameComponent().last(), context().data()); + ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data()); if (importInfo.type() == ImportType::Directory) { return importInfo.path(); diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index 9dfd1b3dc1f..db1d9f9f271 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -152,7 +152,7 @@ void SubComponentManager::parseDirectories() parseDirectory(dirInfo.canonicalFilePath(), false); } - QString fullUrlVersion = path + QLatin1Char('/') + url + QLatin1Char('.') + import.version().split(".").first(); + QString fullUrlVersion = path + QLatin1Char('/') + url + QLatin1Char('.') + import.version().split(".").constFirst(); dirInfo = QFileInfo(fullUrlVersion); if (dirInfo.exists() && dirInfo.isDir()) { diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 1649a17a4a3..e245c060fa7 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -437,7 +437,7 @@ QList AbstractView::selectedModelNodes() const ModelNode AbstractView::firstSelectedModelNode() const { if (hasSelectedModelNodes()) - return ModelNode(model()->d->selectedNodes().first(), model(), this); + return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(); } @@ -445,7 +445,7 @@ ModelNode AbstractView::firstSelectedModelNode() const ModelNode AbstractView::singleSelectedModelNode() const { if (hasSingleSelectedModelNode()) - return ModelNode(model()->d->selectedNodes().first(), model(), this); + return ModelNode(model()->d->selectedNodes().constFirst(), model(), this); return ModelNode(); } @@ -725,7 +725,7 @@ static int getMinorVersionFromImport(const Model *model) if (import.isLibraryImport() && import.url() == "QtQuick") { const QString versionString = import.version(); if (versionString.contains(".")) { - const QString minorVersionString = versionString.split(".").last(); + const QString minorVersionString = versionString.split(".").constLast(); return minorVersionString.toInt(); } } @@ -740,7 +740,7 @@ static int getMajorVersionFromImport(const Model *model) if (import.isLibraryImport() && import.url() == QStringLiteral("QtQuick")) { const QString versionString = import.version(); if (versionString.contains(QStringLiteral("."))) { - const QString majorVersionString = versionString.split(QStringLiteral(".")).first(); + const QString majorVersionString = versionString.split(QStringLiteral(".")).constFirst(); return majorVersionString.toInt(); } } diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index dfea640fd57..fe8ebe17293 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -161,7 +161,7 @@ AbstractProperty BindingProperty::resolveToProperty() const ModelNode node = parentModelNode(); QString element; if (binding.contains(QLatin1Char('.'))) { - element = binding.split(QLatin1Char('.')).last(); + element = binding.split(QLatin1Char('.')).constLast(); QString nodeBinding = binding; nodeBinding.chop(element.length()); node = resolveBinding(nodeBinding, parentModelNode(), view()); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 3b9ddf99c95..70dd0f4fd43 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -1882,17 +1882,17 @@ static bool compareVersions(const QString &version1, const QString &version2, bo QStringList version2List = version2.split(QLatin1Char('.')); if (version1List.count() == 2 && version2List.count() == 2) { bool ok; - int major1 = version1List.first().toInt(&ok); + int major1 = version1List.constFirst().toInt(&ok); if (!ok) return false; - int major2 = version2List.first().toInt(&ok); + int major2 = version2List.constFirst().toInt(&ok); if (!ok) return false; if (major1 >= major2) { - int minor1 = version1List.last().toInt(&ok); + int minor1 = version1List.constLast().toInt(&ok); if (!ok) return false; - int minor2 = version2List.last().toInt(&ok); + int minor2 = version2List.constLast().toInt(&ok); if (!ok) return false; if (minor1 >= minor2) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 641849d004a..7a80390d85d 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -310,7 +310,7 @@ QString ModelNode::simplifiedTypeName() const throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - return QString::fromUtf8(type().split('.').last()); + return QString::fromUtf8(type().split('.').constLast()); } QString ModelNode::displayName() const @@ -1138,7 +1138,7 @@ bool ModelNode::isComponent() const * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. */ - ModelNode componentNode = nodeListProperty("component").toModelNodeList().first(); + ModelNode componentNode = nodeListProperty("component").toModelNodeList().constFirst(); if (componentNode.nodeSourceType() == ModelNode::NodeWithComponentSource) return true; if (componentNode.metaInfo().isFileComponent()) @@ -1175,7 +1175,7 @@ QIcon ModelNode::typeIcon() const QList itemLibraryEntryList = libraryInfo->entriesForType( type(), majorVersion(), minorVersion()); if (!itemLibraryEntryList.isEmpty()) - return itemLibraryEntryList.first().typeIcon(); + return itemLibraryEntryList.constFirst().typeIcon(); else if (metaInfo().isValid()) return QIcon(QStringLiteral(":/ItemLibrary/images/item-default-icon.png")); } diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 19b8b7c1d18..39d99accdf5 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -229,7 +229,7 @@ void ModelToTextMerger::applyChanges() QString errorMessage = QStringLiteral("Error while rewriting"); if (!tmpDocument->diagnosticMessages().isEmpty()) - errorMessage = tmpDocument->diagnosticMessages().first().message; + errorMessage = tmpDocument->diagnosticMessages().constFirst().message; m_rewriterView->enterErrorState(errorMessage); return; diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index 5f65bea40c9..08105bf2be3 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -167,8 +167,8 @@ QString QmlTextGenerator::toQml(const ModelNode &node, int indentDepth) const QString url; if (type.contains('.')) { QStringList nameComponents = type.split('.'); - url = nameComponents.first(); - type = nameComponents.last(); + url = nameComponents.constFirst(); + type = nameComponents.constLast(); } QString alias; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index dc1f03794db..c4cb5bf7102 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -402,7 +402,7 @@ void RewriterView::applyChanges() try { modelToTextMerger()->applyChanges(); if (!errors().isEmpty()) - enterErrorState(errors().first().description()); + enterErrorState(errors().constFirst().description()); } catch (const Exception &e) { const QString content = textModifierContent(); qDebug().noquote() << "RewriterException:" << m_rewritingErrorMessage; @@ -417,7 +417,7 @@ void RewriterView::applyChanges() qDebug().noquote() << "RewriterException: " << m_rewritingErrorMessage; qDebug().noquote() << "Content: " << content; if (!errors().isEmpty()) - qDebug().noquote() << "Error:" << errors().first().description(); + qDebug().noquote() << "Error:" << errors().constFirst().description(); throw RewritingException(__LINE__, __FUNCTION__, __FILE__, qPrintable(m_rewritingErrorMessage), content); } } @@ -668,7 +668,7 @@ QString RewriterView::convertTypeToImportAlias(const QString &type) const if (type.contains('.')) { QStringList nameComponents = type.split('.'); url = getUrlFromType(type); - simplifiedType = nameComponents.last(); + simplifiedType = nameComponents.constLast(); } QString alias; diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 7a624b6e082..f94cd99fb7f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -166,7 +166,7 @@ static inline bool isSignalPropertyName(const QString &signalName) // see QmlCompiler::isSignalPropertyName QStringList list = signalName.split(QLatin1String(".")); - QString pureSignalName = list.last(); + const QString &pureSignalName = list.constLast(); return pureSignalName.length() >= 3 && pureSignalName.startsWith(QStringLiteral("on")) && pureSignalName.at(2).isLetter(); } @@ -611,12 +611,12 @@ public: if (astValueList.count() == 2) { //Check for global Qt enums - if (astValueList.first() == QStringLiteral("Qt") - && globalQtEnums().contains(astValueList.last())) + if (astValueList.constFirst() == QStringLiteral("Qt") + && globalQtEnums().contains(astValueList.constLast())) return QVariant::fromValue(Enumeration(astValue)); //Check for known enum scopes used globally - if (knownEnumScopes().contains(astValueList.first())) + if (knownEnumScopes().contains(astValueList.constFirst())) return QVariant::fromValue(Enumeration(astValue)); } @@ -640,7 +640,7 @@ public: QString rhsValueName; if (AST::IdentifierExpression *idExp = AST::cast(eStmt->expression)) { if (!m_scopeChain.qmlScopeObjects().isEmpty()) - rhsValueObject = m_scopeChain.qmlScopeObjects().last(); + rhsValueObject = m_scopeChain.qmlScopeObjects().constLast(); if (!idExp->name.isEmpty()) rhsValueName = idExp->name.toString(); } else if (AST::FieldMemberExpression *memberExp = AST::cast(eStmt->expression)) { @@ -792,8 +792,8 @@ static bool isLatestImportVersion(const ImportKey &importKey, const QHash") || importPathFirst == QStringLiteral("QML") || importPathFirst == QStringLiteral("QtQml") @@ -1439,7 +1439,7 @@ static QString fileForFullQrcPath(const QString &string) if (stringList.isEmpty()) return QString(); - return stringList.last(); + return stringList.constLast(); } static QString removeFileFromQrcPath(const QString &string) @@ -2046,7 +2046,7 @@ void TextToModelMerger::populateQrcMapping(const QString &filePath) QMap map = ModelManagerInterface::instance()->filesInQrcPath(path); const QStringList qrcFilePaths = map.value(fileName, {}); if (!qrcFilePaths.isEmpty()) { - QString fileSystemPath = qrcFilePaths.first(); + QString fileSystemPath = qrcFilePaths.constFirst(); fileSystemPath.remove(fileName); if (path.isEmpty()) path.prepend(QLatin1String("/")); diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index cbe845240ca..3809e0366bd 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -441,7 +441,7 @@ static QWidget *createbottomSideBarWidget(const QList &widgetInfos) topWidgetInfos.append(widgetInfo); } - QWidget *widget = topWidgetInfos.first().widget; + QWidget *widget = topWidgetInfos.constFirst().widget; if (topWidgetInfos.count() > 1) { QWidget *background = new QWidget(); background->setProperty("designerBackgroundColor", true); diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index f72939d36f0..e5ec89524a2 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -138,7 +138,7 @@ static void openComponentSourcePropertyOfLoader(const ModelNode &modelNode) * the default property is always implcitly a NodeListProperty. This is something that has to be fixed. */ - componentModelNode = modelNode.nodeListProperty("component").toModelNodeList().first(); + componentModelNode = modelNode.nodeListProperty("component").toModelNodeList().constFirst(); } Core::EditorManager::openEditor(componentModelNode.metaInfo().componentFileName(), Core::Id(), Core::EditorManager::DoNotMakeVisible); diff --git a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp index 8e8c0b1cde2..7f03543c2ca 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/colortool/colortool.cpp @@ -170,8 +170,8 @@ void ColorTool::selectedItemsChanged(const QList &itemList) m_formEditorItem->qmlItemNode().setVariantProperty("color", m_oldColor); if (!itemList.isEmpty() - && itemList.first()->qmlItemNode().modelNode().metaInfo().hasProperty("color")) { - m_formEditorItem = itemList.first(); + && itemList.constFirst()->qmlItemNode().modelNode().metaInfo().hasProperty("color")) { + m_formEditorItem = itemList.constFirst(); m_oldColor = m_formEditorItem->qmlItemNode().modelValue("color").value(); if (m_colorDialog.isNull()) { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp index 312f2d83277..2944a195b6b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp @@ -232,7 +232,7 @@ void BackendModel::addNewBackend() QString typeName = dialog.type(); - Import import = Import::createLibraryImport(importSplit.first(), importSplit.last()); + Import import = Import::createLibraryImport(importSplit.constFirst(), importSplit.constLast()); try { diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp index 7bc7f55dff8..88bb7ffec26 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp @@ -160,7 +160,7 @@ QStringList BindingModel::possibleSourceProperties(const BindingProperty &bindin qWarning() << " BindingModel::possibleSourcePropertiesForRow no meta info for target node"; } - const QString id = stringlist.first(); + const QString &id = stringlist.constFirst(); ModelNode modelNode = getNodeByIdOrParent(id, bindingProperty.parentModelNode()); @@ -222,7 +222,7 @@ static PropertyName unusedProperty(const ModelNode &modelNode) void BindingModel::addBindingForCurrentNode() { if (connectionView()->selectedModelNodes().count() == 1) { - ModelNode modelNode = connectionView()->selectedModelNodes().first(); + const ModelNode &modelNode = connectionView()->selectedModelNodes().constFirst(); if (modelNode.isValid()) { try { modelNode.bindingProperty(unusedProperty(modelNode)).setExpression(QLatin1String("none.none")); @@ -386,7 +386,7 @@ bool BindingModel::getExpressionStrings(const BindingProperty &bindingProperty, if (true) { const QStringList stringList = expression.split(QLatin1String(".")); - *sourceNode = stringList.first(); + *sourceNode = stringList.constFirst(); QString propertyName; diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp index 58af1da41cb..2cde52ec617 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp @@ -270,8 +270,8 @@ void ConnectionModel::addConnection() newNode.signalHandlerProperty("onClicked").setSource(QLatin1String("print(\"clicked\")")); if (connectionView()->selectedModelNodes().count() == 1 - && !connectionView()->selectedModelNodes().first().id().isEmpty()) { - ModelNode selectedNode = connectionView()->selectedModelNodes().first(); + && !connectionView()->selectedModelNodes().constFirst().id().isEmpty()) { + const ModelNode &selectedNode = connectionView()->selectedModelNodes().constFirst(); newNode.bindingProperty("target").setExpression(selectedNode.id()); } else { newNode.bindingProperty("target").setExpression(QLatin1String("parent")); diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp index 54b771bf0d3..46acbeb8a69 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionviewwidget.cpp @@ -139,17 +139,17 @@ QList ConnectionViewWidget::createToolBarWidgets() QList buttons; buttons << new QToolButton(); - buttons.last()->setIcon(Utils::Icons::PLUS_TOOLBAR.icon()); - buttons.last()->setToolTip(tr("Add binding or connection.")); - connect(buttons.last(), &QAbstractButton::clicked, this, &ConnectionViewWidget::addButtonClicked); - connect(this, &ConnectionViewWidget::setEnabledAddButton, buttons.last(), &QWidget::setEnabled); + buttons.constLast()->setIcon(Utils::Icons::PLUS_TOOLBAR.icon()); + buttons.constLast()->setToolTip(tr("Add binding or connection.")); + connect(buttons.constLast(), &QAbstractButton::clicked, this, &ConnectionViewWidget::addButtonClicked); + connect(this, &ConnectionViewWidget::setEnabledAddButton, buttons.constLast(), &QWidget::setEnabled); buttons << new QToolButton(); - buttons.last()->setIcon(Utils::Icons::MINUS.icon()); - buttons.last()->setToolTip(tr("Remove selected binding or connection.")); - buttons.last()->setShortcut(QKeySequence(Qt::Key_Delete)); - connect(buttons.last(), &QAbstractButton::clicked, this, &ConnectionViewWidget::removeButtonClicked); - connect(this, &ConnectionViewWidget::setEnabledRemoveButton, buttons.last(), &QWidget::setEnabled); + buttons.constLast()->setIcon(Utils::Icons::MINUS.icon()); + buttons.constLast()->setToolTip(tr("Remove selected binding or connection.")); + buttons.constLast()->setShortcut(QKeySequence(Qt::Key_Delete)); + connect(buttons.constLast(), &QAbstractButton::clicked, this, &ConnectionViewWidget::removeButtonClicked); + connect(this, &ConnectionViewWidget::setEnabledRemoveButton, buttons.constLast(), &QWidget::setEnabled); return buttons; } @@ -233,7 +233,7 @@ void ConnectionViewWidget::removeButtonClicked() if (currentTab() == ConnectionTab) { if (ui->connectionView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->connectionView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->connectionView->selectionModel()->selectedRows().constFirst().row(); ConnectionModel *connectionModel = qobject_cast(ui->connectionView->model()); if (connectionModel) { connectionModel->deleteConnectionByRow(currentRow); @@ -241,7 +241,7 @@ void ConnectionViewWidget::removeButtonClicked() } else if (currentTab() == BindingTab) { if (ui->bindingView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->bindingView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->bindingView->selectionModel()->selectedRows().constFirst().row(); BindingModel *bindingModel = qobject_cast(ui->bindingView->model()); if (bindingModel) { bindingModel->deleteBindindByRow(currentRow); @@ -249,12 +249,12 @@ void ConnectionViewWidget::removeButtonClicked() } else if (currentTab() == DynamicPropertiesTab) { if (ui->dynamicPropertiesView->selectionModel()->selectedRows().isEmpty()) return; - int currentRow = ui->dynamicPropertiesView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->dynamicPropertiesView->selectionModel()->selectedRows().constFirst().row(); DynamicPropertiesModel *dynamicPropertiesModel = qobject_cast(ui->dynamicPropertiesView->model()); if (dynamicPropertiesModel) dynamicPropertiesModel->deleteDynamicPropertyByRow(currentRow); } else if (currentTab() == BackendTab) { - int currentRow = ui->backendView->selectionModel()->selectedRows().first().row(); + int currentRow = ui->backendView->selectionModel()->selectedRows().constFirst().row(); BackendModel *backendModel = qobject_cast(ui->backendView->model()); if (backendModel) backendModel->deletePropertyByRow(currentRow); diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp index b9cca0f4039..a6cb2d911bf 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp @@ -265,7 +265,7 @@ QStringList DynamicPropertiesModel::possibleTargetProperties(const BindingProper void DynamicPropertiesModel::addDynamicPropertyForCurrentNode() { if (connectionView()->selectedModelNodes().count() == 1) { - ModelNode modelNode = connectionView()->selectedModelNodes().first(); + const ModelNode &modelNode = connectionView()->selectedModelNodes().constFirst(); if (modelNode.isValid()) { try { modelNode.variantProperty(unusedProperty(modelNode)).setDynamicTypeNameAndValue("string", QLatin1String("none.none")); @@ -292,7 +292,7 @@ QStringList DynamicPropertiesModel::possibleSourceProperties(const BindingProper qWarning() << " BindingModel::possibleSourcePropertiesForRow no meta info for target node"; } - const QString id = stringlist.first(); + const QString &id = stringlist.constFirst(); ModelNode modelNode = getNodeByIdOrParent(id, bindingProperty.parentModelNode()); @@ -617,7 +617,7 @@ bool DynamicPropertiesModel::getExpressionStrings(const BindingProperty &binding if (true) { const QStringList stringList = expression.split(QLatin1String(".")); - *sourceNode = stringList.first(); + *sourceNode = stringList.constFirst(); QString propertyName; diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp index 4a1e0dba2b9..8653e8a20a4 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp @@ -140,8 +140,8 @@ void PathItem::writePathToProperty() pathSegment.destroy(); if (!m_cubicSegments.isEmpty()) { - pathNode.variantProperty("startX").setValue(m_cubicSegments.first().firstControlPoint().coordinate().x()); - pathNode.variantProperty("startY").setValue(m_cubicSegments.first().firstControlPoint().coordinate().y()); + pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); + pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { writePathAttributes(pathNode, cubicSegment.attributes()); @@ -178,8 +178,8 @@ void PathItem::writePathAsCubicSegmentsOnly() pathSegment.destroy(); if (!m_cubicSegments.isEmpty()) { - pathNode.variantProperty("startX").setValue(m_cubicSegments.first().firstControlPoint().coordinate().x()); - pathNode.variantProperty("startY").setValue(m_cubicSegments.first().firstControlPoint().coordinate().y()); + pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); + pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { @@ -239,7 +239,7 @@ static void drawCubicSegments(const QList &cubicSegments, QPainter { painter->save(); - QPainterPath curvePainterPath(cubicSegments.first().firstControlPoint().coordinate()); + QPainterPath curvePainterPath(cubicSegments.constFirst().firstControlPoint().coordinate()); foreach (const CubicSegment &cubicSegment, cubicSegments) addCubicSegmentToPainterPath(cubicSegment, curvePainterPath); @@ -547,9 +547,9 @@ void PathItem::readControlPoints() m_lastAttributes = actualAttributes; m_lastPercent = percent; - if (m_cubicSegments.first().firstControlPoint().coordinate() == m_cubicSegments.last().fourthControlPoint().coordinate()) { - CubicSegment lastCubicSegment = m_cubicSegments.last(); - lastCubicSegment.setFourthControlPoint(m_cubicSegments.first().firstControlPoint()); + if (m_cubicSegments.constFirst().firstControlPoint().coordinate() == m_cubicSegments.constLast().fourthControlPoint().coordinate()) { + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); + lastCubicSegment.setFourthControlPoint(m_cubicSegments.constFirst().firstControlPoint()); lastCubicSegment.fourthControlPoint().setPathModelNode(pathNode); lastCubicSegment.fourthControlPoint().setPointType(StartAndEndPoint); } @@ -588,8 +588,8 @@ void PathItem::splitCubicSegment(CubicSegment &cubicSegment, double t) void PathItem::closePath() { if (!m_cubicSegments.isEmpty()) { - CubicSegment firstCubicSegment = m_cubicSegments.first(); - CubicSegment lastCubicSegment = m_cubicSegments.last(); + const CubicSegment &firstCubicSegment = m_cubicSegments.constFirst(); + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); lastCubicSegment.setFourthControlPoint(firstCubicSegment.firstControlPoint()); writePathAsCubicSegmentsOnly(); } @@ -598,8 +598,8 @@ void PathItem::closePath() void PathItem::openPath() { if (!m_cubicSegments.isEmpty()) { - CubicSegment firstCubicSegment = m_cubicSegments.first(); - CubicSegment lastCubicSegment = m_cubicSegments.last(); + const CubicSegment &firstCubicSegment = m_cubicSegments.constFirst(); + CubicSegment lastCubicSegment = m_cubicSegments.constLast(); QPointF newEndPoint = firstCubicSegment.firstControlPoint().coordinate(); newEndPoint.setX(newEndPoint.x() + 10.); lastCubicSegment.setFourthControlPoint(ControlPoint(newEndPoint)); @@ -694,7 +694,7 @@ const QList PathItem::controlPoints() const controlPointList.reserve((m_cubicSegments.count() * 4)); if (!m_cubicSegments.isEmpty()) - controlPointList.append(m_cubicSegments.first().firstControlPoint()); + controlPointList.append(m_cubicSegments.constFirst().firstControlPoint()); foreach (const CubicSegment &cubicSegment, m_cubicSegments) { controlPointList.append(cubicSegment.secondControlPoint()); @@ -908,8 +908,8 @@ bool PathItem::isClosedPath() const if (m_cubicSegments.isEmpty()) return false; - ControlPoint firstControlPoint = m_cubicSegments.first().firstControlPoint(); - ControlPoint lastControlPoint = m_cubicSegments.last().fourthControlPoint(); + ControlPoint firstControlPoint = m_cubicSegments.constFirst().firstControlPoint(); + ControlPoint lastControlPoint = m_cubicSegments.constLast().fourthControlPoint(); return firstControlPoint == lastControlPoint; } @@ -939,7 +939,7 @@ void PathItem::removeEditPoint(const ControlPoint &controlPoint) QList cubicSegments = cubicSegmentsContainingControlPoint(controlPoint, m_cubicSegments); if (cubicSegments.count() == 1) { - m_cubicSegments.removeOne(cubicSegments.first()); + m_cubicSegments.removeOne(cubicSegments.constFirst()); } else if (cubicSegments.count() == 2){ CubicSegment mergedCubicSegment = CubicSegment::create(); CubicSegment firstCubicSegment = cubicSegments.at(0); diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp index 2740078ae8b..510181258eb 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathselectionmanipulator.cpp @@ -80,7 +80,7 @@ static ControlPoint getControlPoint(const QList &selectedPoints, c return selectedPoints.at(offsetIndex); else if (isClosedPath) { if (offsetIndex == -1) - return selectedPoints.last(); + return selectedPoints.constLast(); else if (offsetIndex < selectedPoints.count()) return selectedPoints.at(1); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp index a30390e345a..66582f017d2 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathtool.cpp @@ -257,8 +257,8 @@ void PathTool::selectedItemsChanged(const QList &itemList) m_pathItem->writePathToProperty(); delete m_pathItem.data(); - if (!itemList.isEmpty() && hasPathProperty(itemList.first())) { - FormEditorItem *formEditorItem = itemList.first(); + if (!itemList.isEmpty() && hasPathProperty(itemList.constFirst())) { + FormEditorItem *formEditorItem = itemList.constFirst(); m_pathItem = new PathItem(scene()); m_pathItem->setParentItem(scene()->manipulatorLayerItem()); m_pathItem->setFormEditorItem(formEditorItem); diff --git a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp index ad87f996cb3..9c7f32c1bb1 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/sourcetool/sourcetool.cpp @@ -192,7 +192,7 @@ static QString baseDirectory(const QUrl &url) void SourceTool::selectedItemsChanged(const QList &itemList) { if (!itemList.isEmpty()) { - m_formEditorItem = itemList.first(); + m_formEditorItem = itemList.constFirst(); m_oldFileName = m_formEditorItem->qmlItemNode().modelValue("source").toString(); QString openDirectory = baseDirectory(view()->model()->fileUrl()); diff --git a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp index 20ae2ab03d2..fcaaba72cee 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/texttool/texttool.cpp @@ -209,7 +209,7 @@ void TextTool::selectedItemsChanged(const QList &itemList) view()->changeToSelectionTool(); } if (!itemList.isEmpty()) { - FormEditorItem *formEditorItem = itemList.first(); + FormEditorItem *formEditorItem = itemList.constFirst(); m_textItem = new TextEditItem(scene()); textItem()->setParentItem(scene()->manipulatorLayerItem()); textItem()->setFormEditorItem(formEditorItem); diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index a300537bec0..8750f19865c 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -361,7 +361,7 @@ void QmlDesignerPlugin::jumpTextCursorToSelectedModelNode() // visual editor -> text editor ModelNode selectedNode; if (!rewriterView()->selectedModelNodes().isEmpty()) - selectedNode = rewriterView()->selectedModelNodes().first(); + selectedNode = rewriterView()->selectedModelNodes().constFirst(); if (selectedNode.isValid()) { const int nodeOffset = rewriterView()->nodeOffset(selectedNode); @@ -477,7 +477,7 @@ double QmlDesignerPlugin::formEditorDevicePixelRatio() const QList topLevelWindows = QApplication::topLevelWindows(); if (topLevelWindows.isEmpty()) return 1; - return topLevelWindows.first()->screen()->devicePixelRatio(); + return topLevelWindows.constFirst()->screen()->devicePixelRatio(); } QmlDesignerPlugin *QmlDesignerPlugin::instance() From 408c3a153a5541f2a2530f40f51873bb36a01c2e Mon Sep 17 00:00:00 2001 From: Hannes Domani Date: Wed, 17 Jan 2018 18:48:27 +0100 Subject: [PATCH 38/43] Valgrind: Inform about heob/dwarfstack requirements Change-Id: I86b561b474f5676568b490bdfd829f17364ea3c3 Reviewed-by: Orgad Shaneh Reviewed-by: Leena Miettinen Reviewed-by: hjk --- src/plugins/valgrind/memchecktool.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp index 00c49a16d6b..d007f3580fb 100644 --- a/src/plugins/valgrind/memchecktool.cpp +++ b/src/plugins/valgrind/memchecktool.cpp @@ -73,6 +73,7 @@ #include +#include #include #include #include @@ -792,12 +793,27 @@ void MemcheckTool::heobAction() const QString heob = QString("heob%1.exe").arg(abi.wordWidth()); const QString heobPath = dialog.path() + '/' + heob; if (!QFile::exists(heobPath)) { - const QString msg = tr("Heob: Can't find %1").arg(heob); - TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID); - TaskHub::requestPopup(); + QMessageBox::critical(Core::ICore::mainWindow(), tr("Heob"), + tr("The %1 executables must be in the appropriate location.") + .arg("Heob")); return; } + // dwarfstack + if (abi.osFlavor() == Abi::WindowsMSysFlavor) { + const QString dwarfstack = QString("dwarfstack%1.dll").arg(abi.wordWidth()); + const QString dwarfstackPath = dialog.path() + '/' + dwarfstack; + if (!QFile::exists(dwarfstackPath) + && CheckableMessageBox::doNotShowAgainInformation( + Core::ICore::mainWindow(), tr("Heob"), + tr("Heob used with MinGW projects needs the %1 DLLs for proper stacktrace resolution.") + .arg("Dwarfstack"), + ICore::settings(), "HeobDwarfstackInfo", + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, + QDialogButtonBox::Ok) != QDialogButtonBox::Ok) + return; + } + // output xml file QDir wdDir(workingDirectory); const QString xmlPath = wdDir.absoluteFilePath(dialog.xmlName()); From b88bfe7db30aa4dd78568e8de2d1167aaee925fd Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 22 Jan 2018 12:53:35 +0100 Subject: [PATCH 39/43] Filter debug info out when creating macOS disk image Move the script to Python for that, for code sharing Change-Id: I1a0b1ed7fe3ed4413045d478c82621d75800520e Reviewed-by: Iikka Eklund --- qtcreator.pro | 2 +- scripts/common.py | 14 +++++++++ scripts/createDistPackage.py | 17 +--------- scripts/makedmg.py | 60 ++++++++++++++++++++++++++++++++++++ scripts/makedmg.sh | 45 --------------------------- 5 files changed, 76 insertions(+), 62 deletions(-) create mode 100755 scripts/makedmg.py delete mode 100755 scripts/makedmg.sh diff --git a/qtcreator.pro b/qtcreator.pro index d8a95fc2223..1738c44649f 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -112,7 +112,7 @@ macx { BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app" deployqt.commands = $$PWD/scripts/deployqtHelper_mac.sh \"$${APPBUNDLE}\" \"$$[QT_INSTALL_BINS]\" \"$$[QT_INSTALL_TRANSLATIONS]\" \"$$[QT_INSTALL_PLUGINS]\" \"$$[QT_INSTALL_IMPORTS]\" \"$$[QT_INSTALL_QML]\" codesign.commands = codesign --deep -s \"$(SIGNING_IDENTITY)\" $(SIGNING_FLAGS) \"$${APPBUNDLE}\" - dmg.commands = $$PWD/scripts/makedmg.sh $$OUT_PWD/bin $${BASENAME}.dmg + dmg.commands = python -u \"$$PWD/scripts/makedmg.py\" \"$${BASENAME}.dmg\" \"Qt Creator\" \"$$IDE_SOURCE_TREE\" \"$$OUT_PWD/bin\" #dmg.depends = deployqt QMAKE_EXTRA_TARGETS += codesign dmg } else { diff --git a/scripts/common.py b/scripts/common.py index 388ce487fdb..b8f640377ec 100644 --- a/scripts/common.py +++ b/scripts/common.py @@ -163,3 +163,17 @@ def fix_rpaths(path, qt_deploy_path, qt_install_info, chrpath=None): if is_unix_executable(filepath) or is_unix_library(filepath): fix_rpaths_helper(filepath) +def is_debug_file(filepath): + if is_mac_platform(): + return filepath.endswith('.dSYM') or '.dSYM/' in filepath + elif is_linux_platform(): + return filepath.endswith('.debug') + else: + return filepath.endswith('.pdb') + +def is_debug(path, filenames): + return [fn for fn in filenames if is_debug_file(os.path.join(path, fn))] + +def is_not_debug(path, filenames): + files = [fn for fn in filenames if os.path.isfile(os.path.join(path, fn))] + return [fn for fn in files if not is_debug_file(os.path.join(path, fn))] diff --git a/scripts/createDistPackage.py b/scripts/createDistPackage.py index fc6e7b7aaae..2b0c38ea5f4 100755 --- a/scripts/createDistPackage.py +++ b/scripts/createDistPackage.py @@ -45,28 +45,13 @@ def parse_arguments(): parser.add_argument('source_directory', help='source directory with the Qt Creator installation') return parser.parse_args() -def is_debug_file(filepath): - if common.is_mac_platform(): - return filepath.endswith('.dSYM') or '.dSYM/' in filepath - elif common.is_linux_platform(): - return filepath.endswith('.debug') - else: - return filepath.endswith('.pdb') - -def is_debug(path, filenames): - return [fn for fn in filenames if is_debug_file(os.path.join(path, fn))] - -def is_not_debug(path, filenames): - files = [fn for fn in filenames if os.path.isfile(os.path.join(path, fn))] - return [fn for fn in files if not is_debug_file(os.path.join(path, fn))] - def main(): arguments = parse_arguments() tempdir_base = tempfile.mkdtemp() tempdir = os.path.join(tempdir_base, os.path.basename(arguments.source_directory)) try: common.copytree(arguments.source_directory, tempdir, symlinks=True, - ignore=(is_not_debug if arguments.debug else is_debug)) + ignore=(common.is_not_debug if arguments.debug else common.is_debug)) zip_source = os.path.join(tempdir, '*') if arguments.exclude_toplevel else tempdir subprocess.check_call([arguments.sevenzip, 'a', '-mx9', arguments.target_archive, zip_source]) diff --git a/scripts/makedmg.py b/scripts/makedmg.py new file mode 100755 index 00000000000..33721f90a72 --- /dev/null +++ b/scripts/makedmg.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +############################################################################ +# +# Copyright (C) 2018 The Qt Company Ltd. +# Contact: https://www.qt.io/licensing/ +# +# This file is part of Qt Creator. +# +# Commercial License Usage +# Licensees holding valid commercial Qt licenses may use this file in +# accordance with the commercial license agreement provided with the +# Software or, alternatively, in accordance with the terms contained in +# a written agreement between you and The Qt Company. For licensing terms +# and conditions see https://www.qt.io/terms-conditions. For further +# information use the contact form at https://www.qt.io/contact-us. +# +# GNU General Public License Usage +# Alternatively, this file may be used under the terms of the GNU +# General Public License version 3 as published by the Free Software +# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +# included in the packaging of this file. Please review the following +# information to ensure the GNU General Public License requirements will +# be met: https://www.gnu.org/licenses/gpl-3.0.html. +# +############################################################################ + +import argparse +import os +import shutil +import subprocess +import tempfile +import time + +import common + +def parse_arguments(): + parser = argparse.ArgumentParser(description='Create Qt Creator disk image, filtering out debug information files.') + parser.add_argument('target_diskimage', help='output .dmg file to create') + parser.add_argument('dmg_volumename', help='volume name to use for the disk image') + parser.add_argument('source_directory', help='directory with the Qt Creator sources') + parser.add_argument('binary_directory', help='directory that contains the Qt Creator.app') + return parser.parse_args() + +def main(): + arguments = parse_arguments() + tempdir_base = tempfile.mkdtemp() + tempdir = os.path.join(tempdir_base, os.path.basename(arguments.binary_directory)) + try: + common.copytree(arguments.binary_directory, tempdir, symlinks=True, ignore=common.is_debug) + os.symlink('/Applications', os.path.join(tempdir, 'Applications')) + shutil.copy(os.path.join(arguments.source_directory, 'LICENSE.GPL3-EXCEPT'), tempdir) + dmg_cmd = ['hdiutil', 'create', '-srcfolder', tempdir, '-volname', arguments.dmg_volumename, + '-format', 'UDBZ', arguments.target_diskimage, '-ov', '-scrub', '-size', '1g', '-verbose'] + subprocess.check_call(dmg_cmd) + # sleep a few seconds to make sure disk image is fully unmounted etc + time.sleep(5) + finally: + shutil.rmtree(tempdir_base) +if __name__ == "__main__": + main() diff --git a/scripts/makedmg.sh b/scripts/makedmg.sh deleted file mode 100755 index befdf42e884..00000000000 --- a/scripts/makedmg.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -############################################################################ -# -# Copyright (C) 2016 The Qt Company Ltd. -# Contact: https://www.qt.io/licensing/ -# -# This file is part of Qt Creator. -# -# Commercial License Usage -# Licensees holding valid commercial Qt licenses may use this file in -# accordance with the commercial license agreement provided with the -# Software or, alternatively, in accordance with the terms contained in -# a written agreement between you and The Qt Company. For licensing terms -# and conditions see https://www.qt.io/terms-conditions. For further -# information use the contact form at https://www.qt.io/contact-us. -# -# GNU General Public License Usage -# Alternatively, this file may be used under the terms of the GNU -# General Public License version 3 as published by the Free Software -# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -# included in the packaging of this file. Please review the following -# information to ensure the GNU General Public License requirements will -# be met: https://www.gnu.org/licenses/gpl-3.0.html. -# -############################################################################ - -[ $# -lt 2 ] && echo "Usage: $(basename $0) " && exit 2 -[ $(uname -s) != "Darwin" ] && echo "Run this script on Mac OS X" && exit 2; -sourceFolder="$1" -intermediateFolder=$(mktemp -d "/tmp/packagedir.XXXXX") -finalDMGName="$2" -title="Qt Creator" - -echo Preparing image artifacts... -cp -a "${sourceFolder}/" "${intermediateFolder}" -ln -s /Applications "${intermediateFolder}" -cp "$(dirname "${BASH_SOURCE[0]}")/../LICENSE.GPL3-EXCEPT" "${intermediateFolder}/LICENSE.GPL3-EXCEPT.txt" -echo Creating image... -hdiutil create -srcfolder "${intermediateFolder}" -volname "${title}" -format UDBZ "${finalDMGName}" -ov -scrub -size 1g -verbose -# make sure that the image is umounted etc -sleep 4 - -# clean up -rm -rf "${intermediateFolder}" From 4947781bba321f66b0e556dff96bad21fa115dfc Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 22 Jan 2018 16:04:31 +0100 Subject: [PATCH 40/43] Fix more issues with renaming Qt Creator executable Change-Id: I826469bdd90e482a77f4cd65fd4fa7e541103a12 Reviewed-by: Tim Jenssen --- qtcreator.pri | 2 +- qtcreator.pro | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qtcreator.pri b/qtcreator.pri index 0e1879419c5..2a971f29fe5 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -106,7 +106,7 @@ osx { # check if IDE_BUILD_TREE is actually an existing Qt Creator.app, # for building against a binary package - exists($$IDE_BUILD_TREE/Contents/MacOS/Qt Creator): IDE_APP_BUNDLE = $$IDE_BUILD_TREE + exists($$IDE_BUILD_TREE/Contents/MacOS/$$IDE_APP_TARGET): IDE_APP_BUNDLE = $$IDE_BUILD_TREE else: IDE_APP_BUNDLE = $$IDE_APP_PATH/$${IDE_APP_TARGET}.app # set output path if not set manually diff --git a/qtcreator.pro b/qtcreator.pro index 1738c44649f..c8ea8ddd37d 100644 --- a/qtcreator.pro +++ b/qtcreator.pro @@ -2,7 +2,7 @@ include(qtcreator.pri) #version check qt !minQtVersion(5, 6, 2) { - message("Cannot build Qt Creator with Qt version $${QT_VERSION}.") + message("Cannot build $$IDE_DISPLAY_NAME with Qt version $${QT_VERSION}.") error("Use at least Qt 5.6.2.") } @@ -108,8 +108,8 @@ linux { } macx { - APPBUNDLE = "$$OUT_PWD/bin/Qt Creator.app" - BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app" + APPBUNDLE = "$$OUT_PWD/bin/$${IDE_APP_TARGET}.app" + BINDIST_SOURCE = "$$OUT_PWD/bin/$${IDE_APP_TARGET}.app" deployqt.commands = $$PWD/scripts/deployqtHelper_mac.sh \"$${APPBUNDLE}\" \"$$[QT_INSTALL_BINS]\" \"$$[QT_INSTALL_TRANSLATIONS]\" \"$$[QT_INSTALL_PLUGINS]\" \"$$[QT_INSTALL_IMPORTS]\" \"$$[QT_INSTALL_QML]\" codesign.commands = codesign --deep -s \"$(SIGNING_IDENTITY)\" $(SIGNING_FLAGS) \"$${APPBUNDLE}\" dmg.commands = python -u \"$$PWD/scripts/makedmg.py\" \"$${BASENAME}.dmg\" \"Qt Creator\" \"$$IDE_SOURCE_TREE\" \"$$OUT_PWD/bin\" From 01bc302c48334b433f66c01b0694756025148908 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Tue, 23 Jan 2018 12:55:31 +0100 Subject: [PATCH 41/43] Debugger: Do not add CrtDbgReport breakpoints for vc19 The symbol isn't safely resolvable and can lead to unwanted breaks. Task-number: QTCREATORBUG-19628 Change-Id: Iaa58b12cb826a9e20faa64454e806ecab9d613f3 Reviewed-by: hjk Reviewed-by: Christian Stenger --- src/plugins/debugger/cdb/cdbengine.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 3b3ec7d08ee..31e10d0bc03 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -649,12 +649,17 @@ void CdbEngine::runEngine() // else the debugger will slow down considerably. const auto cb = [this](const DebuggerResponse &r) { handleBreakInsert(r, BreakpointModelId()); }; if (boolSetting(CdbBreakOnCrtDbgReport)) { - const QString module = msvcRunTime(runParameters().toolChainAbi.osFlavor()); - const QString debugModule = module + 'D'; - const QString wideFunc = QString::fromLatin1(CdbOptionsPage::crtDbgReport).append('W'); - runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), module), BuiltinCommand, cb}); - runCommand({breakAtFunctionCommand(wideFunc, module), BuiltinCommand, cb}); - runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), debugModule), BuiltinCommand, cb}); + Abi::OSFlavor flavor = runParameters().toolChainAbi.osFlavor(); + // CrtDebugReport can not be safely resolved for vc 19 + if ((flavor > Abi::WindowsMsvc2005Flavor && flavor <= Abi::WindowsMsvc2013Flavor) || + flavor > Abi::WindowsMSysFlavor || flavor <= Abi::WindowsCEFlavor) { + const QString module = msvcRunTime(flavor); + const QString debugModule = module + 'D'; + const QString wideFunc = QString::fromLatin1(CdbOptionsPage::crtDbgReport).append('W'); + runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(wideFunc, module), BuiltinCommand, cb}); + runCommand({breakAtFunctionCommand(QLatin1String(CdbOptionsPage::crtDbgReport), debugModule), BuiltinCommand, cb}); + } } // if (boolSetting(BreakOnWarning)) { // runCommand({"bm /( QtCored4!qWarning", BuiltinCommand}); // 'bm': All overloads. From 6d612941482cd1c40a2781453775bbd6a1c8bfed Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 9 Jan 2018 17:39:06 +0100 Subject: [PATCH 42/43] iOS: Include number into translated strings which depend on it Using this hack will mess up some languages. Change-Id: Ifbd42ecbec31371fe18cc3e8a5e36566b7c84fb9 Reviewed-by: Oswald Buddenhagen Reviewed-by: Leena Miettinen --- src/plugins/ios/iossettingswidget.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/plugins/ios/iossettingswidget.cpp b/src/plugins/ios/iossettingswidget.cpp index 0cb54bd28bc..02168a79add 100644 --- a/src/plugins/ios/iossettingswidget.cpp +++ b/src/plugins/ios/iossettingswidget.cpp @@ -119,7 +119,7 @@ void IosSettingsWidget::onStart() QPointer statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Starting simulator devices...", "", simulatorInfoList.count()), + statusDialog->addMessage(tr("Starting %n simulator device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList> futureList; @@ -185,7 +185,7 @@ void IosSettingsWidget::onReset() const int userInput = QMessageBox::question(this, tr("Reset"), tr("Do you really want to reset the contents and settings" - " of the selected devices?", "", + " of the %n selected device(s)?", "", simulatorInfoList.count())); if (userInput == QMessageBox::No) return; @@ -242,14 +242,14 @@ void IosSettingsWidget::onDelete() return; const int userInput = QMessageBox::question(this, tr("Delete Device"), - tr("Do you really want to delete the selected " - "devices?", "", simulatorInfoList.count())); + tr("Do you really want to delete the %n selected " + "device(s)?", "", simulatorInfoList.count())); if (userInput == QMessageBox::No) return; QPointer statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Deleting simulator devices...", "", simulatorInfoList.count()), + statusDialog->addMessage(tr("Deleting %n simulator device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList> futureList; foreach (const SimulatorInfo &info, simulatorInfoList) { @@ -280,7 +280,7 @@ void IosSettingsWidget::onScreenshot() QPointer statusDialog = new SimulatorOperationDialog(this); statusDialog->setAttribute(Qt::WA_DeleteOnClose); - statusDialog->addMessage(tr("Capturing screenshots from devices...", "", + statusDialog->addMessage(tr("Capturing screenshots from %n device(s)...", "", simulatorInfoList.count()), Utils::NormalMessageFormat); QList> futureList; foreach (const SimulatorInfo &info, simulatorInfoList) { From a40f11e071d78eca267edb75f8808025fcd26a9c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 10 Jan 2018 14:48:58 +0100 Subject: [PATCH 43/43] QbsProjectManager: Add paths of library dependencies to run environment ... with the ability to opt out, as in the qmake run configuration. Task-number: QTCREATORBUG-19274 Change-Id: If4e996a974a82080bb09f2971b0bb5df9173fb14 Reviewed-by: Jake Petroules --- .../qbsprojectmanager/qbsrunconfiguration.cpp | 30 +++++++++++++++---- .../qbsprojectmanager/qbsrunconfiguration.h | 8 ++++- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 7702b4551a9..e63a28e0bdc 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -73,6 +73,8 @@ const char QBS_RC_PREFIX[] = "Qbs.RunConfiguration:"; static QString rcNameSeparator() { return QLatin1String("---Qbs.RC.NameSeparator---"); } +static QString usingLibraryPathsKey() { return "Qbs.RunConfiguration.UsingLibraryPaths"; } + const qbs::ProductData findProduct(const qbs::ProjectData &pro, const QString &uniqeName) { foreach (const qbs::ProductData &product, pro.allProducts()) { @@ -124,6 +126,13 @@ QbsRunConfiguration::QbsRunConfiguration(Target *target) this, &QbsRunConfiguration::installStepChanged); } +QVariantMap QbsRunConfiguration::toMap() const +{ + QVariantMap map = RunConfiguration::toMap(); + map.insert(usingLibraryPathsKey(), usingLibraryPaths()); + return map; +} + bool QbsRunConfiguration::fromMap(const QVariantMap &map) { if (!RunConfiguration::fromMap(map)) @@ -137,6 +146,7 @@ bool QbsRunConfiguration::fromMap(const QVariantMap &map) } setDefaultDisplayName(defaultDisplayName()); + m_usingLibraryPaths = map.value(usingLibraryPathsKey(), true).toBool(); installStepChanged(); return true; @@ -229,6 +239,12 @@ bool QbsRunConfiguration::isConsoleApplication() const return product.properties().value(QLatin1String("consoleApplication"), false).toBool(); } +void QbsRunConfiguration::setUsingLibraryPaths(bool useLibPaths) +{ + m_usingLibraryPaths = useLibPaths; + extraAspect()->environmentChanged(); +} + QString QbsRunConfiguration::baseWorkingDirectory() const { const QString exe = executable(); @@ -245,8 +261,11 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const if (product.isValid()) { QProcessEnvironment procEnv = env.toProcessEnvironment(); procEnv.insert(QLatin1String("QBS_RUN_FILE_PATH"), executable()); + QStringList setupRunEnvConfig; + if (!m_usingLibraryPaths) + setupRunEnvConfig << QLatin1String("ignore-lib-dependencies"); qbs::RunEnvironment qbsRunEnv = project->qbsProject().getRunEnvironment(product, - qbs::InstallOptions(), procEnv, QStringList(), QbsManager::settings()); + qbs::InstallOptions(), procEnv, setupRunEnvConfig, QbsManager::settings()); qbs::ErrorInfo error; procEnv = qbsRunEnv.runEnvironment(&error); if (error.hasError()) { @@ -260,10 +279,6 @@ void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const } } } - - QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(target()->kit()); - if (qtVersion) - env.prependOrSetLibrarySearchPath(qtVersion->librarySearchPath().toString()); } QString QbsRunConfiguration::buildSystemTarget() const @@ -317,6 +332,11 @@ QbsRunConfigurationWidget::QbsRunConfigurationWidget(QbsRunConfiguration *rc) m_rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); m_rc->extraAspect()->addToMainConfigurationWidget(this, toplayout); + m_usingLibPathsCheckBox = new QCheckBox(tr("Add library paths to run environment")); + m_usingLibPathsCheckBox->setChecked(m_rc->usingLibraryPaths()); + connect(m_usingLibPathsCheckBox, &QCheckBox::toggled, m_rc, + &QbsRunConfiguration::setUsingLibraryPaths); + toplayout->addRow(QString(), m_usingLibPathsCheckBox); connect(m_rc, &QbsRunConfiguration::targetInformationChanged, this, &QbsRunConfigurationWidget::targetInformationHasChanged, Qt::QueuedConnection); diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h index af1f8a3f20d..99761216064 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.h @@ -27,8 +27,9 @@ #include -#include +#include #include +#include #include namespace qbs { class InstallOptions; } @@ -63,12 +64,15 @@ public: QString buildSystemTarget() const final; QString uniqueProductName() const; bool isConsoleApplication() const; + bool usingLibraryPaths() const { return m_usingLibraryPaths; } + void setUsingLibraryPaths(bool useLibPaths); signals: void targetInformationChanged(); void usingDyldImageSuffixChanged(bool); private: + QVariantMap toMap() const final; bool fromMap(const QVariantMap &map) final; QString extraId() const final; @@ -83,6 +87,7 @@ private: ProjectExplorer::BuildStepList *m_currentBuildStepList = nullptr; // We do not take ownership! QString m_uniqueProductName; QString m_productDisplayName; + bool m_usingLibraryPaths = true; }; class QbsRunConfigurationWidget : public QWidget @@ -99,6 +104,7 @@ private: QbsRunConfiguration *m_rc; QLabel *m_executableLineLabel; + QCheckBox *m_usingLibPathsCheckBox; bool m_ignoreChange = false; bool m_isShown = false; };