Ver código fonte

HPCC-17261 Match meaning of #$ with $ in place macro is defined

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 5 anos atrás
pai
commit
9bdb2f33e9

+ 3 - 1
ecl/hql/hqlgram.hpp

@@ -418,6 +418,7 @@ public:
     void saveContext(HqlGramCtx & ctx, bool cloneScopes);
     IHqlScope * queryGlobalScope();
     IHqlScope * queryMacroScope();
+    IAtom * queryGlobalScopeId();
 
     bool canFollowCurrentState(int tok, const short * yyps);
     int mapToken(int lexToken) const;
@@ -1125,7 +1126,7 @@ class HqlLex
         HqlLex* getParentLex() { return parentLex; }
         void setParentLex(HqlLex* pLex) { parentLex = pLex; }
         const char* getMacroName() { return (macroExpr) ? str(macroExpr->queryName()) : "<param>"; }
-        IIdAtom * queryMacroScope();
+        const char * queryMacroScopeName();
 
         IPropertyTree * getClearJavadoc();
         void doSlashSlashHash(attribute const & returnToken, const char * command);
@@ -1284,6 +1285,7 @@ private:
         IHqlExpression *macroExpr;
         Owned<IFileContents> forBody;
         Owned<IFileContents> forFilter;
+        IAtom * hashDollar = nullptr;
 
         IXmlScope *xmlScope;
 

+ 4 - 2
ecl/hql/hqlgram.y

@@ -1057,7 +1057,8 @@ badObject
 macro
     : MACRO             {
                             Owned<IFileContents> contents = $1.getContents();
-                            IHqlExpression* expr = createUnknown(no_macro, makeBoolType(), macroAtom, LINK(contents));
+                            IAtom * globalId = parser->queryGlobalScopeId();
+                            IHqlExpression* expr = createUnknown(no_macro, makeBoolType(), globalId, LINK(contents));
 #if defined(TRACE_MACRO)
                             DBGLOG("MACRO>> verify: macro definition at %d:%d\n",yylval.startLine, yylval.startColumn);
 #endif
@@ -1072,7 +1073,8 @@ macro
     | COMPLEX_MACRO     {
                             Owned<IFileContents> contents = $1.getContents();
 
-                            IHqlExpression* expr = createUnknown(no_macro, makeVoidType(), macroAtom, LINK(contents));
+                            IAtom * globalId = parser->queryGlobalScopeId();
+                            IHqlExpression* expr = createUnknown(no_macro, makeVoidType(), globalId, LINK(contents));
 
 #if defined(TRACE_MACRO)
                             DBGLOG("MACRO>> verify: macro definition at %d:%d\n",yylval.startLine, yylval.startColumn);

+ 10 - 4
ecl/hql/hqlgram2.cpp

@@ -421,10 +421,10 @@ IHqlScope * HqlGram::queryGlobalScope()
 
 IHqlScope * HqlGram::queryMacroScope()
 {
-    IIdAtom * scopeName = lexObject->queryMacroScope();
+    const char * scopeName = lexObject->queryMacroScopeName();
     if (scopeName)
     {
-        OwnedHqlExpr matched = getResolveAttributeFullPath(str(scopeName), LSFpublic, lookupCtx);
+        OwnedHqlExpr matched = getResolveAttributeFullPath(scopeName, LSFpublic, lookupCtx);
         if (matched && matched->queryScope())
             return matched->queryScope();
     }
@@ -432,6 +432,12 @@ IHqlScope * HqlGram::queryMacroScope()
     return globalScope;
 }
 
+IAtom * HqlGram::queryGlobalScopeId()
+{
+    const char * globalName = globalScope->queryFullName();
+    return createAtom(globalName);
+}
+
 void HqlGram::init(IHqlScope * _globalScope, IHqlScope * _containerScope)
 {
     minimumScopeIndex = 0;
@@ -11681,9 +11687,9 @@ void HqlGram::simplifyExpected(int *expected)
     simplify(expected, LIBRARY, LIBRARY, SCOPE_FUNCTION, STORED, PROJECT, INTERFACE, MODULE, 0);
     simplify(expected, MATCHROW, MATCHROW, LEFT, RIGHT, IF, IFF, ROW, HTTPCALL, SOAPCALL, PROJECT, GLOBAL, NOFOLD, NOHOIST, ALLNODES, THISNODE, SKIP, DATAROW_FUNCTION, TRANSFER, RIGHT_NN, FROMXML, FROMJSON, 0);
     simplify(expected, TRANSFORM_ID, TRANSFORM_FUNCTION, TRANSFORM, '@', 0);
-    simplify(expected, RECORD, RECORDOF, RECORD_ID, RECORD_FUNCTION, SCOPE_ID, VALUE_MACRO, '{', '@', 0);
+    simplify(expected, SCOPE_ID, '$', HASH_DOLLAR, '^', 0);
+    simplify(expected, RECORD, RECORDOF, RECORD_ID, RECORD_FUNCTION, VALUE_MACRO, '{', '@', '$', HASH_DOLLAR, IF, 0);
     simplify(expected, IFBLOCK, ANY, PACKED, BIG, LITTLE, 0);
-    simplify(expected, SCOPE_ID, '$', 0);
     simplify(expected, SIMPLE_TYPE, _ARRAY_, LINKCOUNTED, EMBEDDED, STREAMED, 0);
     simplify(expected, END, '}', 0);
 }

+ 5 - 8
ecl/hql/hqlparse.cpp

@@ -595,6 +595,7 @@ void HqlLex::pushMacro(IHqlExpression *expr)
         inmacro->yyColumn = macroBodyExpr->getStartColumn();
         inmacro->setParentLex(this);
         inmacro->macroParms.setown(macroParms.getClear());
+        inmacro->hashDollar = macroBodyExpr->queryBody()->queryName();
     }
 }
 
@@ -2385,20 +2386,16 @@ void HqlLex::loadXML(const attribute & errpos, const char *name, const char * ch
     }
 }
 
-IIdAtom * HqlLex::queryMacroScope()
+const char * HqlLex::queryMacroScopeName()
 {
     if (inmacro)
     {
-        IIdAtom * scope = inmacro->queryMacroScope();
+        const char * scope = inmacro->queryMacroScopeName();
         if (scope)
             return scope;
     }
-    if (macroExpr)
-    {
-        IIdAtom * parent = macroExpr->queryFullContainerId();
-        if (parent)
-            return parent;
-    }
+    if (hashDollar)
+        return str(hashDollar);
     return nullptr;
 }
 

+ 2 - 2
ecl/regress/hashdollar4.eclxml

@@ -21,8 +21,8 @@ export m1 := MODULE
     export m2() := MACRO
 
    import #$;
-   import #$.^ as me;
-   import myMod from #$.^;
+   import #$.m1 as me;
+   import myMod from #$;
 
    output(#$.value);
    output(me.value);

+ 5 - 5
ecl/regress/hashdollar5.eclxml

@@ -25,7 +25,7 @@ export
 
    output(#$.value);
    output(myMod.value);
-   #$.z.m1()
+   #$.z.m2()
 ENDMACRO;
   </Attribute>
   <Attribute name="value">
@@ -38,15 +38,15 @@ END;
   </Attribute>
  </Module>
  <Module name="x1.y1.z">
-  <Attribute name="m1">
+  <Attribute name="m2">
 export
- m1() := MACRO
+ m2() := MACRO
 
    import #$;
-   import myMod from #$;
+   import myMod from #$ as myMod2;
 
    output(#$.value);
-   output(myMod.value)
+   output(myMod2.value)
 ENDMACRO;
   </Attribute>
   <Attribute name="value">