Ignore:
Timestamp:
Jul 9, 2019 3:08:30 PM (5 months ago)
Author:
tgutzmann
Message:

Merge from trunk

Location:
branches/dev-mj-1626
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/dev-mj-1626

  • branches/dev-mj-1626/Compiler/ModelicaFrontEnd/src/jastadd/instance/InstLookupComponents.jrag

    r12934 r13095  
    1515*/
    1616
     17import org.jmodelica.util.collections.IntIterator;
    1718
    1819aspect InstLookupComponents {
     
    494495
    495496    /**
    496      * Lookup component, re-evaluating any array accesses except in last component.
     497     * Lookup component, selecting array indices based on i, where i covers this access.
     498     */
     499    syn InstComponentDecl InstAccess.lookupWithIndex(Index i) = lookupWithIndexImpl(i, null);
     500
     501    /**
     502     * Lookup component, selecting array indices based on i, where i covers an InstDot that
     503     * this access is part of.
     504     */
     505    inh InstComponentDecl InstAccess.lookupAsPartWithIndex(Index i);
     506    eq InstDot .getInstAccess(int j).lookupAsPartWithIndex(Index i) =
     507        lookupWithIndexImpl(i, (j < getNumInstAccess() - 1) ? getInstAccess(j + 1) : null);
     508    eq BaseNode.getChild()          .lookupAsPartWithIndex(Index i) =
     509        unknownInstComponentDecl();
     510
     511    protected InstComponentDecl InstAccess.lookupWithIndexImpl(Index i, InstAccess stopAt) {
     512        InstAccess first = getFirstInstAccess();
     513        InstAccess cur = first;
     514        InstComponentDecl icd = cur.myInstComponentDecl();
     515        IntIterator index = i.iterator();
     516       
     517        while (cur != stopAt && icd != null && !icd.isUnknown()) {
     518            if (cur == first) {
     519                icd = icd.arrayCell(index);
     520            } else {
     521                icd = icd.memberArrayCell(cur.name(), index);
     522            }
     523            cur = cur.getNextInstAccess();
     524        }
     525       
     526        return (icd == null) ? unknownInstComponentDecl() : icd;
     527    }
     528
     529    syn InstComponentDecl InstComponentDecl.memberArrayCell(String name, IntIterator index) {
     530        InstComponentDecl res = memberInstComponent(name).targetOrNull();
     531        if (res != null) {
     532            res = res.arrayCell(index);
     533        }
     534        return res;
     535    }
     536
     537    syn InstComponentDecl InstComponentDecl.arrayCell(Index index) = arrayCell(index.iterator());
     538
     539    syn InstComponentDecl InstComponentDecl.arrayCell(IntIterator index) {
     540        if (index.hasNext() && isArray() && !isPrimitive()) {
     541            return getInstComponentDecl(index.next() - 1).arrayCell(index);
     542        } else {
     543            return this;
     544        }
     545    }
     546
     547    /**
     548     * Lookup component, re-evaluating any array indexes except in last component.
    497549     */
    498550    public InstComponentDecl InstAccess.lookupEvaluatingIndices() {
     
    604656    eq InstLibNode.arrayMemberInstComponent(String name, int ndims)              = actualInstClass().arrayMemberInstComponent(name, ndims);
    605657
    606     syn lazy InstLookupResult<InstComponentDecl> InstNode.memberInstComponent(String name)  {
     658    syn InstLookupResult<InstComponentDecl> InstNode.memberInstComponent(String name) {
    607659        if (isArray()) {
    608660            return arrayMemberInstComponent(name, ndims());
    609661        } else {   
    610             for (InstComponentDecl ic : getInstComponentDecls())
    611                 if (ic.matches(name))
    612                     return findInnerComponentIfAny(ic.duplicateOriginal());
    613 
    614             for (InstExtends ie : getInstExtendss()) {
    615                 InstLookupResult<InstComponentDecl> res = ie.memberInstComponent(name);
    616                 if (res.successful())
    617                     return res;
    618             }
    619            
    620             return InstLookupResult.notFound();
    621         }
     662            return memberInstComponentCached(name);
     663        }
     664    }
     665   
     666    syn lazy InstLookupResult<InstComponentDecl> InstNode.memberInstComponentCached(String name)  {
     667        for (InstComponentDecl ic : getInstComponentDecls()) {
     668            if (ic.matches(name)) {
     669                return findInnerComponentIfAny(ic.duplicateOriginal());
     670            }
     671        }
     672
     673        for (InstExtends ie : getInstExtendss()) {
     674            InstLookupResult<InstComponentDecl> res = ie.memberInstComponent(name);
     675            if (res.successful()) {
     676                return res;
     677            }
     678        }
     679       
     680        return InstLookupResult.notFound();
    622681    }
    623682    eq InstSimpleShortClassDecl.memberInstComponent(String name) = actualInstClass().memberInstComponent(name);
Note: See TracChangeset for help on using the changeset viewer.