@Override public MutableByDeclarator mutateType(MutableByDeclarator type) { if (type == null) return null; type = type.clone(); if (type instanceof Function) { TypeRef fs = new TypeRef.FunctionSignature((Function)type).importDetails((Element)type, true); type = (MutableByDeclarator) new TypeRef.Pointer(fs, getPointerStyle()); } else if (type instanceof TypeRef) { type = (MutableByDeclarator) new TypeRef.Pointer((TypeRef)type, getPointerStyle()).importDetails((Element)type, true); } else throw new IllegalArgumentException(type.getClass().getName() + " cannot be mutated by pointer"); ((Element)type).importDetails(this, false); return getTarget() == null ? type : getTarget().mutateType(type); } public Declarator.PointerStyle getPointerStyle() {
@Override protected void visitStoredDeclarations(StoredDeclarations d) { super.visitStoredDeclarations(d); if (d.getDeclarators().size() == 1) { Declarator declarator = d.getDeclarators().get(0); if (declarator instanceof FunctionDeclarator) { FunctionDeclarator fd = (FunctionDeclarator) declarator; Function f = new Function(Function.Type.CFunction, null, d.getValueType(), fd.getArgs()); f.addModifiers(fd.getTarget().getModifiers()); FunctionSignature fs = new FunctionSignature(f); d.setValueType(fs); Declarator target = fd.getTarget(); Declarator newTarget = target == null ? new DirectDeclarator(fd.resolveName(), fd.getDefaultValue()) : target.clone(); d.setDeclarators(Arrays.asList(newTarget)); d.accept(this); } } }
@Override protected void visitStoredDeclarations(StoredDeclarations d) { super.visitStoredDeclarations(d); if (d.getDeclarators().size() == 1) { Declarator declarator = d.getDeclarators().get(0); if (declarator instanceof FunctionDeclarator) { FunctionDeclarator fd = (FunctionDeclarator) declarator; Function f = new Function(Function.Type.CFunction, null, d.getValueType(), fd.getArgs()); f.addModifiers(fd.getTarget().getModifiers()); FunctionSignature fs = new FunctionSignature(f); d.setValueType(fs); Declarator target = fd.getTarget(); Declarator newTarget = target == null ? new DirectDeclarator(fd.resolveName(), fd.getDefaultValue()) : target.clone(); d.setDeclarators(Arrays.asList(newTarget)); d.accept(this); } } }
retval.signature = mark(new FunctionSignature(new Function(Function.Type.CFunction, null, null)), getLine(tk)); retval.signature.getFunction().setType(Function.Type.CFunction);
f.setValueType(new TypeRef.FunctionSignature(ff)); f.setType(Type.CFunction); f.setArgs(getArgs());